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

时间:2013-07-18 21:17:06

标签: c++ vector polymorphism

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

例如,我希望vector<int>myArr保留string x= "Picture This"

5 个答案:

答案 0 :(得分:15)

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

您可以使用boost::variant来获得此类功能:

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

std::vector<string_int> vec;

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

std::string& my_string = boost::get<std::string>(vec[0]);

修改
嗯,现在是2017年。您不再需要Boost拥有variant,因为我们现在拥有std::variant

答案 1 :(得分:9)

是的,可以保留两种不同的类型,您可以创建vectorunion种类型。使用的空间将是更大的类型。联盟类型将解释here以及如何标记类型。一个小例子:

union Numeric
{
    int i;
    float f;
};

std::vector<Numeric> someNumbers;
Numeric n;
n.i = 4;
someNumbers.push_back(n);

您也可以使用std::string但是您需要将union放在带有类型标记的struct中,以便析构程序选择要销毁的正确类型。请参阅链接的末尾。

答案 2 :(得分:4)

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

在C ++ 03中:

std::vector<std::pair<int, std::string> > myArr;

如果您希望向量包含一种可用作两种不同类型的类型:否,则无法完成。

答案 3 :(得分:3)

不,vector必须只保留在尖括号< >内声明的类型的变量。

您可以创建一个具有int成员和string成员的类,然后创建一个vector来保存该类的实例,然后引用{{1}或者int成员。

答案 4 :(得分:0)

没有。 myArr实例化为int类型。它只能存储int类型。