如何用不同类型的迭代器填充向量?

时间:2010-12-02 10:51:25

标签: c++ boost vector iterator

我有以下代码的许多示例:

struct foo1
{
    foo1(int ii = 0, int jj = 0)
    {
        this->ii = ii;
        this->jj = jj;
    }

    int ii;
    int jj;
};

struct foo2
{
    foo2()
    {
    }

    foo2(const foo1& f)
    {
        this->f = f;
    }

    foo1 f;
};
typedef std::vector< foo2 > foo_v;

typedef std::set< int > bar_s;

bar_s barSet;
barSet.insert(1); barSet.insert(2); barSet.insert(3);
barSet.insert(4); barSet.insert(5); barSet.insert(6);

...

foo_v fooVec;
for (bar_s::iterator b = barSet.begin(); b != barSet.end(); ++b)
    fooVec.push_back(foo2(*b));

如何改进填充foo2新矢量的代码?

我正在思考以下几点:

std::remove_copy_if(barSet.begin(), barSet.end(), 
                    std::back_inserter(fooVec), ...)

但是我很难找到一种方法将int类型绑定到foo2结构的新实例。


注意:

std::copy(barSet.begin(), barSet.end(), std::back_inserter(fooVec));

给了我以下错误:

错误1错误C2679:二进制'=':找不到哪个运算符采用'int'类型的右手操作数(或者没有可接受的转换)

2 个答案:

答案 0 :(得分:3)

std::copy(barSet.begin(), barSet.end(), std::back_inserter(fooVec));

int可以转换为`foo'(唯一的构造函数可以用一个int参数调用,而且不是显式的。)

  

错误1错误C2679:二进制'=':找不到哪个运算符采用'int'类型的右手操作数(或者没有可接受的转换)

这是因为foo2不能来自int,只能来自foo1,并且只允许隐式转换的一步。你可以std :: transform:

std::transform(barSet.begin(), barSet.end(), 
               std::back_inserter(fooVec), 
               boost::lambda::constructor<foo2>());

boost :: lambda :: constructor()可以替换为std :: fun_ptr(makeFoo2):

foo2 makeFoo2(const foo& f) { return f; }

答案 1 :(得分:0)

你可以使用带有一对迭代器的vector的构造函数。

foo_v fooVec(barSet.begin(), barSet.end());

鉴于foo的构造函数,int可隐式转换为foo