【问题标题】:How can I fill a vector with iterators of a different type?如何用不同类型的迭代器填充向量?
【发布时间】:2011-05-19 01:27:05
【问题描述】:

下面的代码我有很多例子:

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”类型右手操作数的运算符(或没有可接受的转换)

【问题讨论】:

  • 如果您取消引用 bar_s 上的迭代器,则会产生 int。现在,int 已经可以转换为foo,因此您应该能够将bar_s 上的迭代器后面的值插入foo_v

标签: c++ boost vector iterator


【解决方案1】:
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; }

【讨论】:

  • 抱歉,我已经修改了上面的代码 - 我的真实代码中有多个构造函数。
  • 没问题。 foo 仍然有一个可以用一个 int 参数调用的构造函数。您可以添加另一个构造函数,例如从 double 或 string 或任何你想要的东西,你仍然可以从 int 隐式构造 foo (另外从 double、string 等)。
  • STL 容器也有来自两个迭代器的构造函数,这将复制另一个容器的指定范围。
  • 感谢您的 cmets 到目前为止...道歉,但我的例子是错误的(再次)。我对其进行了修改,并且还给出了使用 std::copy 时遇到的编译错误
【解决方案2】:

您可以使用带有一对迭代器的向量构造函数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多