顺序容器的赋值和swap
现在有两个容器c1和c2,想要把c2的全部元素赋给c1
c1.erase(c1.begin(), c1.end());
c1.insert(c1.begin(), c2.begin(), c2.end());
顺序容器的赋值操作 | 功能 |
---|---|
c1=c2 | 删除c1的所有元素,将c2的元素复制给c1。c1和c2的类型必须相同 |
c={a,b,c…} | 将c1中的元素替换为初始化列表中元素的拷贝(array不适用) |
swap(c1,c2) | 交换c1和c2中的元素。c1和c2必须具有相同的类型。swap通常比从c2向c1拷贝元素快得多 |
c1.swap(c2) | 交换内容:调用完该函数后,c1中存放的是c2原来的元素,c2中存放的则是c1原来的元素。c1和c2的类型必须相同。该函数的执行速度通常要比将c2的元素复制到c1的操作快 |
assign操作 | 不适用关联容器和array |
c.assign(b,e) | 重新设置c的元素:将迭代器b和e标记的范围内所有的元素复制到c中。b和e必须不是指向c中元素的迭代器 |
c.assign(il) | 将容器c中的元素替换为初始化列表il中的元素 |
c.assign(n,t) | 将容器c重新设置为存储n个值为t的元素 |
使用assign
如果容器类型相同,元素类型相同,就可以直接使用赋值操作符(=)将一个容器赋给另一个容器。
如果在不同(相同)类型的容器内,元素类型不相同但是相互兼容,则赋值运算符必须使用assign函数。如:通过assign操作实现将vector容器中一段char*类型的元素赋给string类型的list容器。
list<string> names;
vector<const char*> oldstyle;
names = oldstyle; //错误,类型不匹配
names = oldstyle.assign(oldstyle.cbegin(), oldstyle.cend());
使用swap
swap交换两个相同类型容器的内容。调用swap之后,两个容器的元素会交换
vector<string> svec1(10);
vector<string> svec2(24);
swap(svec1, svec2);
调用swap之后,svec1会右24个元素,svec1有10个元素。swap没有交换元素本身,而是交换了两个数据结构,所以操作会很快。
- 并且swap不对任何元素进行拷贝、删除或插入操作,除了array数组外。因此能在常数级时间内完成。
- 迭代器不会失效, 假设现在有一个iter指向了svec1[3],在交换之后iter指向了svec2[3],变换了容器而已。
- 虽然说可以调用成员函数的swap, s1.swap(s2),但是在泛型编程中,经常调用的是非成员函数的swap。