繁体   English   中英

在C ++中访问boost :: variant向量的元素

[英]Accessing elements of a boost::variant vector in C++

我想在C ++中访问向量的元素。 我已经使用Boost_variant库生成了向量,因为我需要将intstring类型都存储为输入。

现在,我想通过index来访问vector 元素,然后以相反的方式访问它们,以便可以在它们上实现条件-有点类似:

for (int i = last_element_of_vector, i >=0, i--){
     if (myvec[i] == 0 && myvec[i-1] == 1){
         *do something*
     }
}

我似乎只能在向量上找到带有循环的迭代器,并打印出没有任何索引i可以访问元素的元素。

我的MWE如下:

#include <iostream>                         
#include <sstream>                           
#include <string>                           
#include <vector>                           
#include <boost/filesystem.hpp>
#include <boost/assign/std/vector.hpp>
#include <boost/variant.hpp>                

#include <boost/range/adaptor/reversed.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/assign.hpp>
#include <algorithm>

using namespace std;
using namespace boost::adaptors;
using namespace boost::assign;

typedef boost::variant<std::string,int> StringOrInt;

int main()
{
    vector<StringOrInt> bools; 
    bools += 0, 0, 0, 0, 1, 0, 1, 1, 1, 1;

    boost::copy(
                bools | reversed,
                std::ostream_iterator<StringOrInt>(std::cout, ", "));

    return 0;
}

其中main的最后几行仅打印出向量bools的元素,而没有实际提供访问元素的索引。

提前致谢!

for循环确实很多错误。 我在下面固定了那些。

您应该创建一个变体以从变体中获取一些整数值:

struct as_int_visitor : boost::static_visitor<int> {
    int operator()(std::string const& s) const { return std::stoi(s); }
    int operator()(int i)                const { return i; }
};

如下使用它:

int as_int(StringOrInt const& v) {
    return apply_visitor(as_int_visitor{}, v);
}

演示

生活在Coliru

#include <iostream>                         
#include <boost/assign/std/vector.hpp>
#include <boost/assign.hpp>
#include <boost/variant.hpp>                

#include <algorithm>

using namespace std;
using namespace boost::assign;

typedef boost::variant<std::string,int> StringOrInt;

struct as_int_visitor : boost::static_visitor<int> {
    int operator()(std::string const& s) const { return std::stoi(s); }
    int operator()(int i)                const { return i; }
};

int as_int(StringOrInt const& v) {
    return apply_visitor(as_int_visitor{}, v);
}

int main()
{
    vector<StringOrInt> values; 
    values += 0, 3, 4, 6, "42", 0, 1, 1, 1, 1;

    for (int i = values.size()-1; i > 0; --i) {
        std::cout << "At #" << i << " lives " << values[i] << " (evaluates to " << as_int(values[i]) << ")";

        if (as_int(values[i]) == 0 && as_int(values[i-1]) == 1){
            std::cout << " HIT\n";
        } else 
            std::cout << "\n";
    }
}

印刷品:

At #9 lives 1 (evaluates to 1)
At #8 lives 1 (evaluates to 1)
At #7 lives 1 (evaluates to 1)
At #6 lives 1 (evaluates to 1)
At #5 lives 0 (evaluates to 0)
At #4 lives 42 (evaluates to 42)
At #3 lives 6 (evaluates to 6)
At #2 lives 4 (evaluates to 4)
At #1 lives 3 (evaluates to 3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM