要实现输出不同容器的值,且各容器包含的数据类型也不同,可以使用类模板和函数模板来实现。
示例代码如下:
#include <iostream>
#include <vector>
#include <list>template <typename T>
class Container {
private:T container;public:Container(T c) : container(c) {}void print() {for (auto it = container.begin(); it != container.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;}
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::list<std::string> lst = {"apple", "banana", "cherry"};Container<std::vector<int>> intContainer(vec);Container<std::list<std::string>> stringContainer(lst);std::cout << "Vector 内容如下: ";intContainer.print();std::cout << "List 内容如下: ";stringContainer.print();return 0;
}
问题1:container是不是一个容器
在这个代码示例中,container并不是一个容器,它只是一个类模板Container中的一个成员变量。在这里,container的类型是模板参数T所指定的类型,可以是任何类型,包括但不限于容器类型。
在构造函数Container(T c)中,我们将传入的参数c赋值给container,这意味着container将包含传入的参数c的值。在示例中,我们传入了一个vector或list作为参数c,因此container将包含这些容器的值。实际上,container可以是任何类型的数据,不仅仅限于容器类型。
问题2: Container(T c) : container(c) {}解读
这行代码是Container类的构造函数的定义,其中使用了成员初始化列表来初始化Container类的成员变量container。在这里,参数c被传递给container,用于初始化container成员变量。
这行代码的含义是:
- Container(T c):这是Container类的构造函数,接受一个参数c,该参数的类型由模板参数T指定。
- : container(c):这是成员初始化列表的语法,用于初始化Container类的成员变量container。在这里,我们将传入的参数c赋值给container成员变量。
这种成员初始化列表的方式可以在对象构造时更高效地初始化成员变量,尤其是对于类类型的成员变量或常量成员变量。
问题3:为什么这么初始化后,container就可以当容器使用了
在示例代码中,我们定义了一个类模板Container,其中包含一个成员变量container。通过构造函数中的初始化操作
Container(T c) : container(c) {}
,我们将传入的参数c赋值给container成员变量。由于container的类型是模板参数T所指定的类型,我们可以在实例化Container类时将任何类型的数据传递给container。在示例中,我们传入了一个vector或list作为参数c,因此container实际上包含了传入的vector或list。
虽然container本身并不是一个容器,但我们可以通过Container类的成员函数(如print()函数)来访问和操作container成员变量,从而实现对传入的容器进行操作。因此,通过这种方式初始化container,我们可以在Container类中使用传入的容器数据,实现对不同类型的容器进行操作。
实战:我博客中C++ primer plus第十六章第16.8题充分运用了这里的知识点,建议大家可以尝试一下。