您的位置:首页 > 编程语言 > C语言/C++

C++序列容器标准库笔记

LYAJJ 2020-06-29 05:04 183 查看 https://blog.csdn.net/lyajj/ar

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] << " ";//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) << " ";//V.at()访问元素
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;
}//用于unique
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; }//能传入sort()作参数进行降序排序

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);//将L1的元素传入L2,同时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;//判断L1是否有元素
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);
}

标签: