14

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

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

4

5 回答 5

19

您可以使用联合,但有更好的选择。

您可以使用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

于 2013-07-18T21:22:22.797 回答
12

是的,可以容纳两种不同的类型,您可以创建一种vector类型union。使用的空间将是较大的类型。此处解释了联合类型以及如何标记类型。一个小例子:

union Numeric
{
    int i;
    float f;
};

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

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

于 2013-07-19T16:43:33.053 回答
6

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

在 C++03 中:

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

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

于 2013-07-18T23:04:31.403 回答
3

不,avector必须只包含在尖括号中声明的类型的变量< >

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

于 2013-07-18T21:20:17.710 回答
0

No.myArr被实例化为持有int类型。它只能存储int类型。

于 2013-07-18T21:20:30.813 回答