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

2014-11-24 12:32:32 · 作者: · 浏览: 14

}
print(odd.begin(),odd.end());
print(even.begin(),even.end());
system("pause");
return 0;
}

关系操作符


string 类型的关系运算


1. 如果两个容器具有相同的长度而且所有元素都相等,那么这两个容器就相
等;否则,它们就不相等。
2. 如果两个容器的长度不相同,但较短的容器中所有元素都等于较长容器中
对应的元素,则称较短的容器小于另一个容器。
3. 如果两个容器都不是对文的初始子序列,则它们的比较结果取决于所比较
的第一个不相等的元素。

所有容器都通过比较其元素对来实现关系运算


使用越界的下标,或调用空容器的 front 或 back 函数,都会
导致程序出现严重的错误。


使用下标运算的另一个可选方案是 at 成员函数 .这个函数的行
为和下标运算相似,但是如果给出的下标无效,at 函数将会抛出 out_of_range
异常


删除顺序容器内元素的操作


c.erase(p) 删除迭代器 p 所指向的元素
返回一个迭代器,它指向被删除元素后面的元素。如果 p 指向
容器内的最后一个元素,则返回的迭代器指向容器的超出末端
的下一位置。如果 p 本身就是指向超出末端的下一位置的迭代
器,则该函数未定义
c.erase(b,e) 删除迭代器 b 和 e 所标记的范围内所有的元素
返回一个迭代器,它指向被删除元素段后面的元素。如果 e 本
身就是指向超出末端的下一位置的迭代器,则返回的迭代器也
指向容器的超出末端的下一位置
c.clear() 删除容器 c 内的所有元素。返回 void
c.pop_back() 删除容器 c 的最后一个元素。返回 void。如果 c 为空容器,
则该函数未定义
c.pop_front() 删除容器 c 的第一个元素。返回 void。如果 c 为空容器,则
该函数未定义
只适用于 list 或 deque 容器


删除第一个或最后一个元素


pop_front 和 pop_back 函数用于删除容器内的第一个和最后一个元素。但
vector 容器类型不支持 pop_front 操作。这些操作删除指定的元素并返回
void。


find 函数需要一对标记查找范围的迭代器以
及一个在该范围内查找的值作参数。查找完成后,该函数返回一个迭代器,它指
向具有指定值的第一个元素,或超出末端的下一位置。


Exercise
9.26:
假设有如下 ia 的定义,将 ia 复制到一个 vector 容器
和一个 list 容器中。使用单个迭代器参数版本的 erase
函数将 list 容器中的奇数值元素删除掉,然后将
vector 容器中的偶数值元素删除掉。
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55,
89 };

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

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

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

void deleteelem(list&lst,int flag)
{
int base=(flag%2==0 0:1);
list::iterator head=lst.begin(),tail=lst.end();
while(head!=tail)
//这里不用更新指向容器尾端的迭代器
//因为list容器删除元素后没有出现元素的移动
{
if(*head%2==base)
head=lst.erase(head);
//巧妙利用函数返回值
else
head++;
}
}

void deleteelem(vector&vec,int flag)
{
int base=(flag%2==0 0:1);
vector::iterator head=vec.begin(),tail=vec.end();
while(head!=(tail=vec.end()))
//这里要更新一下指向容器尾端的迭代器
//因为vector容器删除元素后元素要顺序前移是迭代器失效
{
if(*head%2==base)
head=vec.erase(head);
else
head++;
}
}

int main()
{
int ia[10]={0,1,2,3,4,5,6,7,8,9};
listodd(ia,ia+10);
vectoreven(ia,ia+10);
print(odd.begin(),odd.end());
print(even.begin(),even.end());
deleteelem(odd,2);
print(odd.begin(),odd.end());
deleteelem(even,1);
print(even.begin(),even.end());
system("pause");
return 0;
}


Exercise
9.27:
编写程序处理一个 string 类型的 list 容器。在该容器
中寻找一个特殊值,如果找到,则将它删除掉。用 deque
容器重写上述程序。


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

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

void Print(deque::iterator beg,deque::iterator end)
{
while(beg!=end)