如何在向量中存储整数和字符串?

nm1*_*m17 1 c++ types vector

我需要将元素存储在连续的容器中,例如std::vector. 问题是容器需要支持插入或两者都支持intstd::string

这在 C++ 中似乎很难做到,因为它是一种强类型语言。我想做一些类似的事情

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

或者

struct custom_struct {
  int val;
  std::string;
  bool is_val;    // true if integer and false if string
};
std::vector<custom_struct> container;
Run Code Online (Sandbox Code Playgroud)

但这似乎都不是一个很好的选择。第一个的问题是,我不知道如何在该对表示整数还是字符串之间切换,因此为什么我想出了第二种方法,尽管第二种方法不是很优雅,因为我必须重复键入检查使用is_val

我可以在 C++ 中考虑其他方法吗?

Sam*_*hik 6

这是std::variant为了:

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

基本上,这也是unionC、C++ 的类型安全版本,但std::variant也是类型安全的。正确使用std::variant会迫使您正确实现类型安全,例如,仅当它实际上包含 a 时才container[0]像 a 一样对待(否则您将得到抛出的异常作为对错误的奖励)。执行所有需要完成的操作,以便正确“在 [variant] 表示整数还是字符串之间切换”。std::stringstd::stringstd::variant

如何使用的完整描述和总结std::variant不能仅用一两段文字来解释,因此请参阅 C++ 教科书或参考手册以获取更多信息。std::variant需要 C++17 或更高版本。