有两种方法(我知道)将一个向量分配给另一个向量:
std::vector<std:string> vectorOne, vectorTwo;
// fill vectorOne with strings
// First assign method
vectorTwo = vectorOne;
// Second assign method
vectorTwo.assign( vectorOne.begin(), vectorOne.end() );
这些方法确实存在差异,或者在非常大的载体上进行效率和安全性方面是否相同?
答案 0 :(得分:6)
他们几乎相同。第二个原因是 你可能有需要(隐式)转换的类型:
std::vector<int> vi;
std::vector<double> vd;
// ...
vd.assign( vi.begin(), vi.end() );
或者容器的类型可能不同:
vd.assign( std::istream_iterator<double>( file ),
std::istream_iterator<double>() );
如果你知道两个容器的类型相同,那就是 使用任务。它的优点是只使用一个 引用源,并可能允许移动语义 C ++ 11。
答案 1 :(得分:5)
第二种形式是通用的,它适用于任何迭代器类型,只是复制源向量中的元素。
第一种形式只适用于完全相同类型的vector
,它复制元素,而在C ++ 11中也可以通过从源向量复制分配器来替换分配器。
在您的示例中,类型是相同的,并使用无状态的std::allocator
,因此没有区别。您应该使用第一个表单,因为它更简单,更容易阅读。
答案 2 :(得分:1)
在这种情况下它们是等效的。 [和C ++ 03标准]。但是,如果vectorTwo在赋值之前包含元素,则会有所不同。然后
vectorTwo = vectorOne; // use operator=
// Any elements held in the container before the call
// are either assigned to or destroyed.
vectorTwo.assign() // any elements held in the container
// before the call are destroyed and replaced by newly
// constructed elements (no assignments of elements take place).
需要 assign
,因为operator=
采用单个右侧操作数,因此在需要默认参数值或值范围时使用assign
。 assign
可以通过首先创建合适的向量然后分配它来间接完成:
void f(vector<Book>& v, list<Book>& l){
vector<Book> vt = (l.begin(), l.end());
v = vt;
}
然而,这可能既丑陋又效率低下(例子来自Bjarne Stroustrup“The C ++ ......”)
另请注意,如果vector不是同一类型,那么还需要允许隐式转换的assign
:
vector<int> vi;
vector<double> vd;
// ...
vd.assign( vi.begin(), vi.end() );