C++ 如何用不同类型的迭代器填充向量?
我有以下代码的许多示例:C++ 如何用不同类型的迭代器填充向量?,c++,boost,vector,iterator,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;
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));
但我正在努力找到一种方法,将int
类型绑定到foo2
结构的新实例
注: 给我以下错误: 错误1错误C2679:二进制“=”:未找到接受类型为“int”的右操作数的运算符(或没有可接受的转换) 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>());
您可以使用向量的构造函数来获取一对迭代器
foo_v fooVec(barSet.begin(), barSet.end());
给定
foo
的构造函数,int
隐式转换为foo
,如果在bar\u s
上取消对迭代器的引用,将导致int
。现在,int
已经可以转换为foo
,因此您应该能够将bar\u s
上的迭代器后面的值插入foo\u v
对不起,我已经修改了上面的代码-我的真实代码中有多个构造函数。没问题。foo仍然有一个可以用一个int参数调用的构造函数。您还可以添加另一个构造函数,例如,从double或string或任何您想要的,并且您仍然能够从int隐式构造foo(另外从double、string等)。STL容器也有来自两个迭代器的构造函数,这将复制另一个容器的指定范围。感谢您到目前为止的评论。。。抱歉,但我的例子(又)错了。我修改了它,并且给出了使用std::copy时出现的编译错误
std::copy(barSet.begin(), barSet.end(), std::back_inserter(fooVec));
std::transform(barSet.begin(), barSet.end(),
std::back_inserter(fooVec),
boost::lambda::constructor<foo2>());
foo2 makeFoo2(const foo& f) { return f; }
foo_v fooVec(barSet.begin(), barSet.end());