- 容器:
用来管理一组元素。
序列式容器:
vector
将元素置于一个动态数组中加以管理。
可以随机存取元素,用索引直接存取。
数组尾部添加或移除元素非常快,但是在中部或头部安插元素比较费时。
// this is the part of vector
int a[5] = {1,2,3,4,5};
vector<int> coll(a,a+5);
for (int i=6;i<=10;i++)
{
coll.push_back(i);
}
for (int i=0;i<coll.size();i++)
{
cout<<coll[i]<<" ";
}
deque
是”double-ended queue”的缩写
可以随机存取元素(用索引直接存取)
数组头部和尾部添加或移除元素都非常快,但在中部安插元素比较费时。
deque<float> deques;
for (int i = 1;i<=6;i++)
{
deques.push_front(i*1.1);
}
for (int i=0;i<deques.size();i++)
{
cout<<deques[i]<<" ";
}
List双向链表
不提供随机存取,按顺序走到需存取的元素。O(n)
在任何位置上执行插入或删除动作都非常迅速,内部只需要调整一下指针。
list<char> lists;
for (char c = 'a';c<='z';c++)
{
lists.push_back(c);
}
while(lists.empty()==false)
{
cout<<lists.front();
lists.pop_front();
}
迭代器(Iterator)
通过迭代器,我们可以使用相同的方式来访问,遍历容器。
使用方法如下:
int ai[5] = {1,2,3,4,5};
vector<int> ivec(ai,ai+5);
vector<int>::iterator iter;
for(iter = ivec.begin();iter!=ivec.end();++iter)
cout<<*iter<<" ";
每种容器都必须提供自己的迭代器。
迭代器的概念:
1. 迭代器是一个“可遍历STL容器内全部或部分元素”的对象
2. 一个迭代器指出容器中的一个特定位置。
3. 具有遍历复杂数据结构的能力。
迭代器的基本操作有:
- Operator* :返回当前位置上的元素值,如果该元素拥有成员,你可以通过迭代器,直接使用operator->取用他们。
- Operator++,将迭代器前进至下一个元素,大多数迭代器还可以使用operator–,退回到前一个元素。
- operator==和operator!=
判断两个迭代器是否指向同一位置。
- operator=
为迭代器赋值。
class Student{
public:
int no;
string name;
Student(int no,string name)
{
this->no = no;
this->name = name;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
list<Student> lists;
for (int i =0;i<10;i++)
{
char name[20];
sprintf_s(name,"csl%d",i+1);
Student stu(i+1,name);
lists.push_back(stu);
}
list<Student>::iterator iter;
for (iter=lists.begin();iter!=lists.end();++iter)
{
cout<<(*iter).name<<"---"<<iter->name<<endl;
iter->no = iter->no *2;
}
for (iter=lists.begin();iter!=lists.end();++iter)
{
cout<<(*iter).no<<"---"<<iter->no<<endl;
}
getchar();
return 0;
}
需要说明两点:第一:当迭代器拥有的元素有成员时,可以使用operator->直接取用或者调用。
第二:当需要将实数与字符串进行拼接的时候,可以使用如下的方式:
char name[20];
sprintf_s(name,”csl%d”,i+1);
char * 转string是可以直接进行转换的。
- 关联式容器
Sets/Multisets
内部的元素依据其值自动排序。
Set内相同数值的元素只能出现一次,Multiset内可包含多个数值相同的元素,内部由二叉树实现(具体来说,就是红黑树),便于查找。
typedef set<int> IntSet;
set<int> coll;
coll.insert(1);//没有push_back。因为他是自动排序的
coll.insert(6);
coll.insert(2);
coll.insert(4);
coll.insert(3);
coll.insert(6);
IntSet::const_iterator pos;
for (pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";//迭代器输出的时候是有序遍历的
}
输出结果为: 1 2 3 4 6
Maps/Multimaps
Map的元素是成对的键值对,内部的元素依据其值自动排序。
map内相同数值的元素只能出现一次,multimap内可包含多个数值相同的元素。
内部由二叉树实现。便于查找。
容器的共通操作:
初始化:
list< int > l;
vector< int > ivec(l.begin(),l.end());
..
int array[]= {1,2,3,4};
set< int > iset(array,array+sizeof(array)/sizeof(array[0]));