创建包含两种不同数据类型或类的向量

Per*_*son 10 c++ polymorphism vector

我正在尝试创建一个包含int和字符串的向量.这可能吗?

例如,我想vector<int>myArr坚持string x= "Picture This"

Moh*_*oun 15

你可以使用联盟,但有更好的选择.

您可以使用它boost::variant来获得这种功能:

using string_int = boost::variant<std::string, int>;

std::vector<string_int> vec;
Run Code Online (Sandbox Code Playgroud)

要从变体中获取字符串或int,您可以使用boost::get:

std::string& my_string = boost::get<std::string>(vec[0]);
Run Code Online (Sandbox Code Playgroud)

编辑
嘛,现在是2017年.variant正如我们现在所拥有的那样,你不再需要Boost了std::variant!


dev*_*vil 9

是的,它可以容纳两个不同的类型,你可以创建vectorunion类型.使用的空间将是更大的类型.此处说明联合类型以及如何标记类型.一个小例子:

union Numeric
{
    int i;
    float f;
};

std::vector<Numeric> someNumbers;
Numeric n;
n.i = 4;
someNumbers.push_back(n);
Run Code Online (Sandbox Code Playgroud)

您也可以使用,std::string但是您需要将union一个struct带有类型标记的析构函数放入,以选择要销毁的正确类型.请参阅链接的末尾.


Cas*_*sey 6

如果您希望向量包含两种不同的类型,您可以使用 a std::pair(或者std::tuple如果超过两个)

在 C++03 中:

std::vector<std::pair<int, std::string> > myArr;
Run Code Online (Sandbox Code Playgroud)

如果您希望向量包含一种可以用作两种不同类型的类型:不,这是不可能的。


Cor*_*ein 3

不可以, avector只能保存尖括号内声明的类型的变量< >

您可以创建一个具有一个int成员和一个string成员的类,然后创建一个vector来保存该类的实例,然后在需要时引用int或成员。string

  • @CoryKlein:确实如此。但给学习者的建议永远不要提及容器中的指针。它很少被需要,而且很容易搞砸,以至于在手头的实际问题需要它之前解释这种可能性是没有任何意义的。然后你仍然会建议智能指针。 (2认同)