STL的头文件不再使用常规的 .H 扩展, 避免和其他头文件冲突.
扩展的容器类还有 multimap multiset priority_queue
常用容器
队列容器: vector deque list
关联容器: set map
vector :
动态数组, 是基本数组的类模板.
vector vi; //初始长度为0的空向量
vector vi(init_size, 0); //
init_size可以用const预定义, 0为初始化值.
vector v3(v2); //复制构造函数, 完全复制.
vector v4(first,last); //产生初始值为一个区间的向量. 包括first, 不包括last
迭代
for (int i=0; iconst_iterator或者iterator it=vi.begin(); it!=vi.end(); ++it) *p=xxx;
-
#include
#include
#include
using namespace std;
int iArr[10] = {1,23,4,56,7,89,0,12,3,1};
char* szArr = "Hello World";
int main(void)
{
vector vec0(3, 0);
vector vec1(iArr, iArr+10); //vec1 的内容为 "1 23 4 56 7 89 0 12 3 45"
vector vec2(szArr, szArr+strlen(szArr)); //vec2 的内容为 "H e l l o W o r l d"
if (vec1[9] == vec1.at(9)) {
cout << "vec1[9] == vec1.at(9) --> " << vec1[9] << " == " << vec1.at(9) << endl;
//打印 vec1[9] == vec1.at(9) --> 1 == 1
}
if (vec1.front() == vec1.back()) {
cout << "vec1.front() == vec1.back() --> " << vec1.front() << " == " << vec1.back() << endl;
//打印 vec1.front() == vec1.back() --> 1 == 1
}
//vec1.insert(vec1.begin()+1, vec0.begin(), vec0.end()); //此时vec1为 "1 0 0 0 23 4 56 7 89 0 12 3 45"
//vec1.erase(vec1.begin()+1, vec1.end()-2); //此时变成 " 1 3 1 ", 即保留第一个元素, 后面保留两个元素
//vec1.assign(4, 888); //把vec1重新定义成 4个元素, 每个元素的初始值为 888
//vec1.pop_back(); //删除最后一个元素
for (vector::const_iterator p=vec1.begin(); p!=vec1.end(); ++p)
cout << *p << " ";
cout << endl;
for (vector::const_iterator p=vec2.begin(); p!=vec2.end(); ++p)
cout << *p << " ";
cout << endl;
return 0;
}
-
其他api如
vi.push_back(2) //把2元素放到vi的后面
vi.insert(vi.begin()+1, 2); //把2元素放到vi的第一个位置上.
vi.insert(vi.begin()+1, v3.begin(), v3.end()); //在vi第一的位置上开始插入v3的所有成员.
vi.assign(8,1); //给vi重新赋值, 8个成员的初始值都为1.
vi.front() ; //vi的第0个成员
vi.back(); //vi最后一个成员.
vi.at(4); //vi的第5个成员.
vi[4]; //vi的第5个成员.
vi.size();//vi的成员个数
vi.empty(); //判断成员是否为空.
vi.pop_back(); //把最后一个成员移除
vi.erase(vi.begin()+1, vi.end()-2); //删除成员
deque : double queue. 支持随机访问和快速插入删除, 在容器的某个位置上花费的时间为线性时间. 同时支持开始断插入数据API. push_front(); 不支持capacity() 和 reserve().
其他操作和 vector 相同.
list 是双线性列表, 只能顺序访问(从前到后, 或者从后到前), 不支持随机访问, 不能用下标[]操作符.
但仍然有 erase() insert() push_back() push_front()操作.
特有的
sort(); 排序列表
merge() 合并两个排序 list
splice() 拼接两个 list ,
将元素从x转移到当前容器中,并将其插入对应位置。效果是X容器中对应的元素被移除, 目标容器的内容被加入. 从而改变了两个容器的大小.
entire list (1)
|
void splice (const_iterator position, list& x);
void splice (const_iterator position, list&& x);
|
single element (2)
|
void splice (const_iterator position, list& x, const_iterator i);
void splice (const_iterator position, list&& x, const_iterator i);
|
element range (3)
|
void splice (const_iterator position, list& x, const_iterator first, const_iterator last);
void splice (const_iterator position, list&& x, const_iterator first, const_iterator last);
|
-
#include <iostream>
-
#include <list>
-
-
int main ()
-
{
-
std::list<int> mylist1, mylist2;
-
std::list<int>::iterator it;
-
-
// set some initial values:
-
for (int i=1; i<=4; ++i)
-
mylist1.push_back(i); // mylist1: 1 2 3 4
-
-
for (int i=1; i<=3; ++i)
-
mylist2.push_back(i*10); // mylist2: 10 20 30
-
-
it = mylist1.begin();
-
++it; // points to 2
-
-
//整体转移
-
mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
-
// mylist2 (empty) 整个被转移了.
-
// "it" still points to 2 (the 5th element)
-
//转移一个
-
mylist2.splice (mylist2.begin(), mylist1, it);
-
// mylist1: 1 10 20 30 3 4
-
// mylist2: 2
-
// "it" is now invalid.
-
it = mylist1.begin();
-
//将迭代器向前移动n个元素位置
-
std::advance(it,3); // "it" points now to 30
-
-
//转移一批.
-
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
-
// mylist1: 30 3 4 1 10 20
-
-
std::cout << "mylist1 contains:";
-
for (it=mylist1.begin(); it!=mylist1.end(); ++it)
-
std::cout << ' ' << *it;
-
std::cout << '\n';
-
//mylist1 contains: 30 3 4 1 10 20
-
-
std::cout << "mylist2 contains:";
-
for (it=mylist2.begin(); it!=mylist2.end(); ++it)
-
std::cout << ' ' << *it;
-
std::cout << '\n';
-
//mylist2 contains: 2
-
-
return 0;
-
}
阅读(3301) | 评论(0) | 转发(0) |