接受容器大小做形参的构造函数只是用于顺序容器,而关联容器不支持这种初始化.
2.C++中,大多数类型都可用作容器的元素类型.容器元素类型必须满足以下两个约束:
1).元素类型必须支持赋值运算
2).元素类型的对象必须可以复制
注:没有元素是引用类型的容器,也没有元素是IO类型的容器
3.使用迭代器编写程序时,必须留意那些操作会使迭代器失效.使用无效的迭代器将会导致严重的运行错误.(在使用迭代器时,通常可以编写程序使得要求迭代器有效的代码范围相对较短,然后,在该范围内,严格检查每一条语句,判断是否有元素添加或删除,从而相应的调整迭代器的值.
关于容器大小比较,其原理与泛型算法一样.需要支持原子的大小比较操作符.
#include <iostream>
#include <vector>
#include <set>
#include <list>
#include <string>
#include <bitset>
#include <algorithm>
using namespace std;
struct Usr
{
int i;
string strUiD; //用户标示ID
string strSrnName; //用户名称
string strNickName; //昵称
string strDesc; //个人简介
string strGender; //性别
string strIcon; //头像图片
string strVtitle; //暂时不知
string strVType; //用户是够通过真实身份验证(0未通过)
Usr( string strUiD )
{
this->strUiD = strUiD;
}
};
inline bool operator== ( const Usr& usrOne,const Usr& usrTwo )
{
if ( usrOne.strUiD == usrTwo.strUiD )
{
return true;
}
return false;
}
void main()
{
vector<Usr> vecUsr;
Usr usr( "ysl" );
vecUsr.push_back( usr );
usr.strUiD = "abc";
usr.strVtitle = "初级";
vecUsr.push_back( usr );
usr.strUiD = "abc";
vector<Usr>::const_iterator cIter = find( vecUsr.begin(),vecUsr.end(),usr );
if ( cIter != vecUsr.end() )
{
cout<<cIter->strVtitle<<endl;
}
system( "pause" );
}
4.顺序容器的操作
●顺序容器库中添加元素的操作
c.push_back(t) 在容器c的尾部添加值为t的元素,返回void
c.push_front(t) 在容器c的前端添加值为t的元素,返回void(只适用list和deque容器类型)
c.insert(p,t) 再迭代器p所指向的元素前插入值为t的新元素.返回指向新添加元素的迭代器
c.insert(p,n,t) 添加n个值为t的新元素,返回void类型
c.insert(p,b,e) 在迭代器p所指向的元素前插入有迭代器b和e标记的范围内的元素,返回void
注:不要存储end操作迭代器,添加或删除deque和vector容器的元素都会导致存储的迭代器失败.
●顺序容器大小的操作
c.maxsize() 返回容器c可容纳的最多元素个数
c.resize(n) 调整容器c的大小,如果n<c.size()则删除多出来的元素,否则使用默认初始化多余的元素
c.resize(n,t) 调整c的大小,如果n<c.size()添加元素t
●访问顺序容器的元素
c.back() 返回容器c的最后一个元素的引用
c.front() 返回容器c的第一个元素的引用
●删除顺序容器内元素的操作
c.erase(p) 删除p所指的元素
c.erase(b,e) 删除b-e之间的元素
c.clear() 删除容器的所有元素
c.pop_back() 删除容器的最后一个元素
c.pop_front() 删除容器的第一个元素(仅适合list和deque)
注意:pop_front和pop_back函数的返回值并不是删除的元素的值,而是void
●赋值与swap
c1 == c2 删除容器c1的所有元素,然后将c2的元素复制给c1
c1.swap(c2) 交换内容:调用玩该函数后,c1中存放的是c2原来的元素.c1存放的是c2原来的元素,该函数的执行速度通常要比将c2复制到c1的操作快
c.assign(b,e) 重新设置c的元素:将迭代器b和e标志的范围内所有元素复制到c中(它也是先清空c)
c.assign(n,t) 将容器c从新设置为存储n个值为t的元素
注意:关于swap的一个重要的问题在于:该操作不会删除或插入任何元素,而且保证在正常时间内实现交换.由于容器内没有移动任何元素,因此迭代器不会失效
举例如下:
vector<int>vec1;
vector<int>vec2;
for (inti = 0;i<10;i++)
{
vec1.push_back(i);
}
for (intj = 0;j<5;j++)
{
vec2.push_back(j+20);
}
std::vector<int>::iteratoriter1 =vec1.begin();
std::vector<int>::iteratoriter2 =vec2.begin();
vec1.swap(vec2);
cout<<"vec1.begin= "<<*iter1<<"/nvec2.begin= "<<*iter2<<endl;
5.对于vector容器,系统在分配容量时要比当前所需的空间多一些.vector容器预留了这些额外的储存区,用于存放新添加的元素.
size和capacity的区别:前者值容器当前拥有的元素个数,后者值容器在必须分配新存储空间之前可以存储的元素的总数.
reserve(n) 设置vector应该预留多少个元素的存储空间
capacity() 返回分配新存储之前可以存储空间之前可以存储的元素总数
当vector容器不得不分配新的存储空间时,以加倍当前容量的分配策略实现重新分配
6.使用容器类型的法则:
1).如果程序要求随机访问元素,则应该使用vector或者deque容器;
2).如果程序必须在容器的中间位置插入或删除元素,则应采用list容器
3).如果程序不是在容器的中间位置,而是在容器的首部或者尾部插入或删除元素,则应采用deque容器
4).如果只需在读取输入时在容器的中间位置插入元素,然后随机访问元素,则可考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,以适应其顺序访问,然后将其复制到vector容器.
注意:通常来说,除非找到选择使用其他容器的更好的理由,否则vector容器都是最佳选择,并建议多使用迭代器而非下标
7.string不支持带有单个容器长度作为参数的构造函数(其函数很多,而且在实际上用不了那么多,所以在此偷下懒,省略,如果需要用到它则可查阅MSDN).
8.除了顺序容器,标准库还提供了=三种顺序容器适配器:queue,priority_queue和stack:需要包含的相关头文件:#include<stack>
#include<queue>
stack适配器所关联的基础容器可以是任意一种顺序容器,而queue适配器要求其关联的基础容器必须提供push_front操作,因此只能建立在list上,而不能建立在vector上
●栈适配器:
s.empty() 如果栈为空
s.size() 返回栈种元素的个数
s.pop() 删除栈顶元素,但不返回其值
s.top() 返回栈顶元素的值,但不删除它
s.push() 在栈顶压入新元素
●队列和优先级队列支持的操作
q.empty() 如果队列为空
q.size() 返回队列中元素的个数
q.pop() 删除队首元素,但不删除其值
q.front() 返回队首元素的值(只是用于队列)
q.back() 返回队尾元素的值,但不删除它(只是用于队列)
q.top() 返回具有最高有优先级的元素值(该操作只适于优先级队列)
q.push() 对于queue,在队尾压入一个新元素
对priority_queue,在基于优先级的适当位置插入新元素
常见问题列举:
error C2653: 'vector<int,class std::allocator<int> >' : is not a class or namespace name
error C2065: 'size_type' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'ix'
error C2065: 'ix' : undeclared identifier
error C2143: syntax error : missing ')' before '++'
warning C4552: '!=' : operator has no effect; expected operator with side-effect
error C2059: syntax error : ';'
error C2059: syntax error : ')'
error C2143: syntax error : missing ';' before '{'
处理方法:在vector前加上std::