使用 int 和 string 参数生成向量

Posted

技术标签:

【中文标题】使用 int 和 string 参数生成向量【英文标题】:Generating a vector with int and string arguments 【发布时间】:2016-03-23 16:03:15 【问题描述】:

我想使用 C++ 中的 boost 库 (boost::variant) 来定义整数和字符串的向量。我正在努力填充这样一个向量 - 有人可以发布一个示例代码,用 intsstrings 填充一个向量 使用 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&lt;&gt; 而不是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 参数生成向量的主要内容,如果未能解决你的问题,请参考以下文章

暴力求解法——子集生成(位向量法)

暴力求解法——子集生成(位向量法)

从模板生成排列

如何生成像列表理解这样的向量

c++ 以最佳方式返回结构和向量

实体框架从表达式生成错误的参数类型