C++序列容器标准库笔记
序列容器:vector,list,deque,提供对顺序表的表示和操作
通用
实例化:
vector/list/deque <数据类型> 标识符 (beg,end)
以地址beg开始,到地址end的数据序列为初值构造容器
vector/list/deque <数据类型> 标识符 (length,i)
实例化长度为length,置元素初值为i的向量
vector/list/deque <数据类型> 标识符 {a,b}
实例化含有两个元素的向量
添加元素:
函数 | 功能 |
---|
v.push_back(a) | 在容器末端插入元素a |
v.insert(iter_pos,a) | 在迭代器所指位置插入元素a |
删除元素:
函数 | 功能 |
---|
v.erase(iter_pos) | 删除迭代器所指位置的元素 |
v.erase(beg,end) | 删除以地址beg开始,到地址end结束的元素 |
v.pop_back() | 删除容器末端的元素 |
v.clear() | 清除所有元素 |
容器元素位置相关:
函数 | 功能 |
---|
v.begin() | 返回指向首元素的迭代器 |
v.end() | 返回指向尾元素下一位置的迭代器 |
v.rbegin() | 返回指向逆向首元素的迭代器 |
v.rend() | 返回逆向尾元素下一位置的迭代器 |
容器元素个数相关:
函数 | 功能 |
---|
v.size() | 返回容器的元素个数,无符号型 |
v.empty() | 判断容器是否为空 |
v.max_size() | 返回容器可容纳元素的最大数量 |
特有
Vector容器:
函数 | 功能 |
---|
v[i] | 访问第i个元素 |
v.at(i) | 访问第i个元素,不检查下标 |
#include<iostream>
#include<vector>
using namespace std;
int main()
{
const int size = 5;
int a[size] = { 1,20,3,40,5 };
vector<int> V(a, a + size);
cout << "using V[i]:";
for (int i = 0; i < size; i++)
cout << V[i] << " ";
cout << endl;
V.push_back(2);
vector<int>::iterator itr = V.begin();
V.insert(itr+3, 30);
cout << "using V.at():";
for (int i = 0; i < int(V.size()); i++)
cout << V.at(i) << " ";
cout << endl;
V.pop_back();
V.erase(itr);
cout << "using itr:";
for (itr = V.begin(); itr != V.end(); itr++)
cout << *itr << " ";
cout << endl;
cout << "The last element(using rbegin()) is:";
cout << *(V.rbegin()) << endl;
cout << "The last element (using end()) is:";
cout << *(V.end() - 1) << endl;
cout << "The first element (using rend()) is:";
cout << *(V.rend() - 1) << endl;
}

List容器:
函数 | 功能 |
---|
v.push_front(a) | 在容器始端插入元素a |
v.pop_front() | 删除容器开端的元素 |
v.sort() | 排列v.sort()默认升序排列,如果降序要传入函数参数 |
v.unique() | 删除重复元素,要sort()后才使用 |
v.merge(v1) | 将v1的元素并入v中,v1,v都要经过排序才行。且v1中的元素为空 |
v.splice(itr,v1) | 将v1的所有元素剪切到v中itr所指位置 |
v.splice(itr,v1,itr1) | 将v1的itr1位置的元素剪切到v的itr开始的位置 |
v.splice(itr,v1,itr1,itr1_) | 将v1的itr1位置到itr1_位置的元素剪切到v的itr开始的位置 |
v.reverse() | 逆转v中元素次序 |
#include<iostream>
#include<list>
using namespace std;
class Test {
private:
int a;
int b;
public:
Test(int a_, int b_) :a(a_), b(b_) {};
friend bool operator < (Test& t1, Test& t2) {
return t1.a < t2.a;
}
friend bool operator == (Test& t1, Test& t2) {
return t1.a == t2.a;
}
friend bool inorder(Test& t1, Test& t2);
void show() {
cout << "a:" << a << " b:" << b;
}
};
bool inorder(Test& t1, Test& t2) { return t1.a > t2.a; }
int main()
{
list<Test> L1;
L1.push_back(Test(1, 11));
L1.push_back(Test(5, 33));
L1.push_back(Test(4, 20));
L1.push_back(Test(3, 55));
L1.push_back(Test(2, 30));
L1.push_back(Test(2, 2));
list<Test>::iterator itr = L1.begin();
for (; itr != L1.end(); itr++)
{
itr->show();
cout << endl;
}
L1.sort(inorder);
cout << "\nafter sort():\n";
for (itr = L1.begin(); itr != L1.end(); ++itr)
{
itr->show();
cout << endl;
}
L1.unique();
cout << "\nafter unique():\n";
for (itr = L1.begin(); itr != L1.end(); itr++)
{
itr->show();
cout << endl;
}
L1.sort();
list<Test> L2;
L2.merge(L1);
cout << "\nL1 go to L2:\n";
for (itr = L2.begin(); itr != L2.end(); ++itr)
{
itr->show();
cout << endl;
}
cout << "\nL1 is empty? ";
if (L1.empty())
cout << "Yes" << endl;
else cout << "NO" << endl;
list<Test>::iterator itr2 = L2.begin();
itr = L1.begin();
for (int i = 0; i < 3; i++)
++itr2;
L1.splice(itr,L2,itr2);
cout << "\nL1 has something from L2 by splice:\n";
for (itr = L1.begin(); itr != L1.end(); ++itr)
{
itr->show();
cout << endl;
}
cout << "\nL2 has:\n";
for (itr2 = L2.begin(); itr2 != L2.end(); ++itr2)
{
itr2->show();
cout << endl;
}
}

deque容器:
函数 | 功能 |
---|
v.push_front(a) | 在容器始端插入元素a |
v.pop_front() | 删除容器开端的元素 |
v[i] | 访问第i个元素 |
v.at(i) | 访问第i个元素,不检查下标 |
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> D{ 10,2,5 };
D.push_back(25);
D.push_front(1);
for (int i = 0; i<int(D.size()); i++)
cout << D[i] << " ";
cout << endl;
for (int i = 0; i<int(D.size()); i++)
cout << D.at(i) << " ";
cout << "\nThe first element is:" << *(D.begin());
cout << "\nThe last element is:" << *(D.end() - 1);
}
