我有一个例子,可以生成唯一的对象到一个向量中:
#include <iostream>
#include <vector>
#include <algorithm>
int v=0;
struct A
{
A() : refValue( v++)
{ std::cout<<"constructor refValue="<<refValue<<std::endl; }
A( const A &r ) : refValue(r.refValue)
{ std::cout<<"copy constructor refValue="<<refValue<<std::endl; }
A& operator=( const A &r )
{
refValue = r.refValue;
std::cout<<"operator= refValue="<<refValue<<std::endl;
return *this;
}
~A() { std::cout<<"destructor refValue="<<refValue<<std::endl; }
int refValue;
};
A GenerateUnique()
{
A unique;
return unique;
}
struct B
{
B( const int n) : v()
{
std::generate_n( std::back_inserter( v ), n, &GenerateUnique );
}
std::vector< A > v;
};
int main()
{
B b(3);
}
如果我把我的主函数更改为这个:
struct B
{
B( const int n) : v(n)
{
}
std::vector< A > v;
};
如果使用上述方式,则会将一个类型为A的对象复制到所有向量元素中。
是否有一种方法可以创建包含所有唯一对象的向量(与第一个示例类似)?
为了更清楚地表达:我有一个包含向量的类。此向量必须包含所有唯一对象(而不是一个对象的副本)。并且我想在初始化列表中初始化它(而不是在构造函数体中初始化)。
boost::assign::list_of
,但是那需要在编译时知道数量。我需要一个在运行时也能工作的解决方案。 - BЈовићA() != A()
,这相当反直觉。你可以将状态移入GenerateUnique()
中。然而,在这种情况下,你的std::generate_n()
解决方案实际上是惯用的。 - MSaltersmain
转换成一个返回as
的函数,然后你就可以进行复制初始化,但这样做与在构造函数体中完成相比没有任何优势。 - GManNickG