使用 int 和 string 参数生成向量
Posted
技术标签:
【中文标题】使用 int 和 string 参数生成向量【英文标题】:Generating a vector with int and string arguments 【发布时间】:2016-03-23 16:03:15 【问题描述】:我想使用 C++ 中的 boost 库 (boost::variant) 来定义整数和字符串的向量。我正在努力填充这样一个向量 - 有人可以发布一个示例代码,用 ints
和 strings
填充一个向量 使用 Boost 库 并读取向量的元素或以其他方式指导我举个例子。
我在 SO 上搜索了标签为 boost::variants
的文章,但找不到我想要的。
【问题讨论】:
到目前为止你尝试了什么?示例代码 如果我是正确的boost::variant<vector<string>, vector<int> > v;
定义了一个向量 v
与 int 和字符串输入。但我不确定如何填写。
@DimChtz,我也看过 boost tutorial
【参考方案1】:
这里有一些例子(凭记忆写的):
typedef boost::variant<
std::string,
int
> StringOrInt; // using a typedef is just for convenience
StringOrInt myVariant;
myVariant = std::string("hello"); // both of these work
myVariant = 5;
std::vector<StringOrInt> myvec;
myvec.push_back(5);
myvec.push_back(std::string("hello"));
那么阅读,有两种方式。一种是使用 boost::get,另一种是使用访问者。访问者通常更健壮一些,但如果是简单的情况,boost::get 可以很好地工作。
std::string& mystr = boost::get<std::string>(myvec[0]); // this will throw if the type you requested isn't what's stored
std::string* mystr = boost::get<std::string*>(myvec[0]); // pointer version doesn't throw
由于您可能正在迭代,因此访问者可能会更好地工作。您创建了一个函子,该函子对变体中的每种类型都有重载,并使用boost::apply_visitor
。例如:
struct MyVisitor
void operator()(const std::string& arg) const
std::cout << "It was a string";
void operator()(int arg) const
std::cout << "It was an int";
;
MyVisitor myVisitor;
for (auto& val : myvec)
boost::apply_visitor(myVisitor, val);
【讨论】:
我收到编译错误:没有匹配的函数调用 apply_visitor,当我尝试通过迭代访问向量的元素时。即,如果我使用您发布的代码的最后一段。有什么建议吗? 您能否解释一下最后一部分的作用,即应用访问者部分? 我已经更新了代码。它应该有struct MyVisitor : public boost::static_visitor<>
而不是struct MyVisitor
。
@Sid 看起来您可能已经猜到了,但是 apply_visitor 调用了访问者函数,将变量作为参数传递。我不知道它到底是如何工作的,但你可以想象它解包变体,将其转换为实际类型,并为你的函数调用正确的重载。我相信它是以“访客模式”命名的。另外,请随时编辑我的帖子,以便未来的人们受益。
谢谢阿里!我已经提交了一个更改......只是等待它经过同行评审,然后它会被发布!【参考方案2】:
您可以创建一个字符串向量,然后在带有数字的位置使用 .toString()。或者至少在 Java 中,您可以创建一个类 VectorIntString,该类的每个实例都有两个向量。因此,当您构造对象时: 你会做这样的事情
VectorIntString vec= new VectorIntString(int a,String a, int b, String b.... ,);
因此构造函数会将奇数位置添加到 Int 向量,将偶数位置添加到 String 向量。
【讨论】:
以上是关于使用 int 和 string 参数生成向量的主要内容,如果未能解决你的问题,请参考以下文章