容器就是数据结构的泛指,迭代器就是指针的泛指,可以指向元素。它可以用来存储数据,就比如杯子用来装水一样。而STL中的容器有很多,它包括vector,list,map,deque,set等。我就简单列举vector,list,map为例吧,
1.Vector
又称向量,跟数组结构差不多。它的内存是连续的,拥有与数组一样的特点,但它又更加灵活,可以在首尾两端插入删除数据更加方便。支持[]操作符,在中间插入删除元素效率很低,而且支持扩容。
1)本身属性与方法:
1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据
19.insert(p,elem); 在指针p指向的位置插入数据elem,返回指向elem位置的指针
20.insert(p,n,elem); 在位置p插入n个elem数据,无返回值
21.insert(p,begin,end) 在位置p插入在区间[begin,end)的数据,无返回值
2)vector的声明
vector<ElemType> c; 创建一个空的vector
vector<ElemType> c1(c2); 创建一个vector c1,并用c2去初始化c1
vector<ElemType> c(n) ; 创建一个含有n个ElemType类型数据的vector;
vector<ElemType> c(n,elem); 创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;
c.~vector<ElemType>(); 销毁所有数据,释放资源;
3)简单用法
//数据存入
ElemType可以是多种,int,float,double,string,CString,struct等,举例:
vector<int> c;
for(int i=0;i<8;i++)
{
c.push_back(i);
}
//数据删除
c.pop_back(pos);//尾删除
vector<int>::iterator iter=c.begin();
for(; iter!=c.end(); ) //指定删除元素
{
if( *iter == 3)
iter = c.erase(iter);
else
iter ++ ;
}
由上可以看出,我们可以使用迭代器和循环法两种方法操作vector,如下:
for ( int i = 0; i < c.size(); ++i )
{
cout << c[ i ] << ' ';
cout << endl;
}
但是 更典型的做法是使用 vector 操作集中的begin()和 end()所返回的迭代器 iterator
for ( vector<string>::iterator it = c.begin();it != c.end(); ++it )
{
cout << *it << ' ';
cout << endl;
}
2.List
list是以链表形式实现的,不支持[],对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是
对于插入就快的多了,不需要拷贝和移动数据,只需要改变指针的指向就可以了。
1)本身属性与方法:
assign() 给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素
3)List简单用法
list<int> c;
for(int i=0;i<8;i++)//链表插入数据
{
c.push_back(i);
}
//删除数据 list<int>::iterator iter= c.begin();
while(iter != c.end())
{
if( *iter == 3)
iter = c.erase(iter);
else
iter ++ ;
}
3.map
是一类关联式容器,增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。自动建立Key - value的对应。key 和 value可以是任意你需要的类型,内部遵循哈希表,有可能插入的数据顺序改变了。使用给定的Key,可以迅速地从单元集合中检索到相应的元素。因此,在需要对大量数据进行查找操作而查找的性能又占据重要地位的场合,Map无疑是一种较理想的容器。
1)属性与方法
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
2)map的声明
map<key,value>mapst;
3)map的一些用法:
主要简述一些map的构造方法:
1.用insert函数插入pair数据
Map<int, string> mapArmy;
mapArmy.insert(pair<int, string>(1, “student_one”));
mapArmy.insert(pair<int, string>(2, “student_two”));
mapArmy.insert(pair<int, string>(3, “student_three”));
map<int, string>::iterator iter;
for(iter = mapArmy.begin(); iter !=mapArmy.end(); iter++)
{
Cout<<iter->first<<” ”<<iter->second<<end;
}
2.用insert函数插入value_type数据
Map<int, string> mapArmy;
mapArmy.insert(map<int, string>::value_type (1, “刘备”));
mapArmy.insert(map<int, string>::value_type (2, “关羽”));
mapArmy.insert(map<int, string>::value_type (3, “张飞”));
map<int, string>::iterator iter;
for(iter = mapArmy.begin(); iter !=mapArmy.end(); iter++)
{
Cout<<iter->first<<” ”<<iter->second<<end;
}
3.第三种:用数组方式插入数据
Map<int, string> mapStudent;
mapStudent[1] = “刘备”;
mapStudent[2] = “关羽”;
mapStudent[3] = “张飞”;
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
Cout<<iter->first<<” ”<<iter->second<<end;
}
总体来说,从存储数组上讲vector,list,map有本质上的区别,vector是连续存储的一段内存;list是链式存储,内存不连续,以地址相连;map是键-值对一一对应关系存储,针对特定数据的;其次数据的访问效率问题,vector可以快速插入数据,但是问题是访问任意元素效率并不高,而链表主要是插入删除更加方面,只是指针的操作。