C++ Primer_顺序容器杂记(三)

2014-11-24 12:32:32 · 作者: · 浏览: 3
cout<<*beg++<<" ";
cout< }

void Delete(list&lst,string str)
{
list::iterator beg=lst.begin();
while(beg!=lst.end())
{
if(*beg==str)
beg=lst.erase(beg);
else
beg++;
}
}

void Delete(deque&dq,string str)
{
deque::iterator beg=dq.begin();
while(beg!=dq.end())
{
if(*beg==str)
beg=dq.erase(beg);
else
beg++;
}
}

int main()
{
string str[10]={"you","will","when","pray","believe","many","we","pray","with","no"};
listlst(str,str+10);
dequedq(str,str+10);
Print(lst.begin(),lst.end());
Print(dq.begin(),dq.end());
string delstr="pray";
Delete(lst,delstr);
Print(lst.begin(),lst.end());
Delete(dq,delstr);
Print(dq.begin(),dq.end());
system("pause");
}


赋值与 swap


赋值操作符首先 erases 其左操作
数容器中的所有元素,然后将右操作数容器的所有元素 inserts 到左边容器中


赋值和 assign 操作使左操作数容器的所有迭代器失效。swap
操作则不会使迭代器失效。完成 swap 操作后,尽管被交换的
元素已经存放在另一容器中,但迭代器仍然指向相同的元素。


assign 操作首先删除容器中所有的元素,然后将其参数所指定的新元素插
入到该容器中。与复制容器元素的构造函数一样,如果两个容器类型相同,其元
素类型也相同,就可以使用赋值操作符(=)将一个容器赋值给另一个容器。如
果在不同(或相同)类型的容器内,元素类型不相同但是相互兼容,则其赋值运
算必须使用 assign 函数。例如,可通过 assign 操作实现将 vector 容器中一
段 char* 类型的元素赋给 string 类型 list 容器。


由于 assign 操作首先删除容器中原来存储的所有元素,因此,
传递给 assign 函数的迭代器不能指向调用该函数的容器内的
元素。


使用 swap 操作以节省删除元素的成本


swap 操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须
匹配:操作数必须是相同类型的容器,而且所存储的元素类型也必须相同。调用
了 swap 函数后,右操作数原来存储的元素被存放在左操作数中,反之亦然。
vector svec1(10); // vector with 10 elements
vector svec2(24); // vector with 24 elements
svec1.swap(svec2);

关于 swap 的一个重要问题在于:该操作不会删除或插入任何
元素,而且保证在常量时间内实现交换。由于容器内没有移动
任何元素,因此迭代器不会失效。

执行 swap 后,容器 svec1 中存储 24 个 string 类型的元素,而 svec2 则存
储 10 个元素。


没有移动元素这个事实意味着迭代器不会失效。它们指向同一元素,就像没
作 swap 运算之前一样。虽然,在 swap 运算后,这些元素已经被存储在不同的
容器之中了。例如,在做 swap 运算之前,有一个迭代器 iter 指向 svec1[3] 字
符串;实现 swap 运算后,该迭代器则指向 svec2[3] 字符串(这是同一个字符
串,只是存储在不同的容器之中而已)。


Exercise
9.28:
编写程序将一个 list 容器的所有元素赋值给一个
vector 容器,其中 list 容器中存储的是指向 C 风格字
符串的 char* 指针,而 vector 容器的元素则是 string
类型。

view plain
#include
#include
#include
#include
using namespace std;

void print(list::iterator beg,list::iterator end)
{
cout<<"Print List String Called"< while(beg!=end)
{
cout<<*beg<<" ";
beg++;
}
cout< }

void print(vector::iterator beg,vector::iterator end)
{
cout<<"Print Vector Const Char * Called"< while(beg!=end)
{
cout<<*beg<<" ";
beg++;
}
cout< }

int main()
{
string str1[2]={"Hello","Ubuntu!"};
const char* str2[3]={"I","Love","C++"};
listlst1(str1,str1+2),lst2(str2,str2+3);
vectorvec(str2,str2+3);
print(lst1.begin(),lst1.end());
print(lst2.begin(),lst2.end());
print(vec.begin(),vec.end());
//assign test
cout<<"assign test"< lst1.assign(vec.begin(),vec.end());
print(lst1.begin(),lst1.end());
print(vec.begin(),vec.end());
//swap test
cout<<"swap test"< lst1.swap(lst2);
print(lst1.begin(),lst1.end());
print(lst2.begin(),lst2.end());
system("pause");
return 0;
}


vector 容器的自增长

vector 容器的元素以连续的方式存放——每一个元素都紧挨着前一个元素存储。


在 list 容器中添加一个元素,标准库只需创建一个新元素,然后将该新元素
连接在已存在的链表中,不需要重新分配存储空间,也不