vector
vector就是加强版的数组,是连续的顺序的储存结构(和数组一样的类别),有长度可变的特性。
时间复杂度:O(n)
vector的创建
vector<int> pn1 = {1,2,3,4,5,6,7,8,9}; // 构造int数组
vector<int> pn2(10); // 构造初始长10的int数组
vector<int> pn3(10,1); // 构造初始长10的int数组,初值为1
vector<vector<int>> pn4(10,vector<int>()); // 构造初始10行,不指定列数的二维数组
vector<vector<int>> pn5(10, vector<int> (6, -1)); // 构造初始10行,初始6列的二维数组,初值为 1
//打印vector
for(int i = 0 ;i < pn1.size() ;i++)
{
cout<< i << endl;
}
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < pn5[i].size(); ++j) {
cout << pn5[i][j] << " ";
}
cout << endl;
}
插入和弹出
push_back() :插入
pop_back() :弹出
//pop_back():删除 vector 尾部的一个元素,数组长度 −1
//push_back(元素):在 vector 尾接一个元素,数组长度 +1
pn1.push_back(11);
pn1.pop_back();
其他操作
clear() :清空
empty() :判断是否为空
resize(新长度,默认值) :改变数组的长度
size() :获取长度
cout<< pn1.size()<<endl;
pn1.clear();
if (pn1.empty())
{
cout<<123<<endl;
}
pn1.resize(2,2);
一般情况下 vector
可以替换掉普通数组,如果长度已经确定,那么应当直接在构造函数指定长度,而不是一个一个 .push_back()
. 因为 vector
额外内存耗尽后的重分配是有时间开销的,直接指定长度就不会出现重分配了。
STACK
实现先进后出的数据结构
主要用法:
push() :入栈
pop() :出栈
top() : 栈顶
//实现先进后出的数据结构
stack<int> sta1;
//进栈
sta1.push(1);
sta1.push(1);
//出栈
sta1.pop();
//取出栈顶元素
int pn = sta1.top();
queue
主要用法:
push() :进队
pop() :出队
front() :取队首
back() :取队尾
queue<int> que;
que.push(1);
que.pop();
int a = que.front();
int b = que.back();
set集合
提供对数时间的插入、删除、查找的集合数据结构。底层原理是红黑树。
集合的三要素:
确定性:一个元素要么在集合中,要么不在
互异性:一个元素仅可以在集合中出现一次
无序性:集合中的元素是没有顺序的
创建and遍历
遍历分为两种:使用迭代器进行遍历、基于范围的循环
set<int> st1 = {1,2,3,4,5,6}; // 储存int的集合(从小到大)
set<int, greater<int>> st2; // 储存int的集合(从大到小)
//遍历
//迭代器
for(set<int>::iterator it = st1.begin();it != st1.end(); it++ )
{
cout << *it << endl;
}
//基于范围的循环(C++ 11)
for (auto &pn : st1)
{
cout << pn << endl;
}
其他用法
insert() :插入
erase() :删除
find() :查找
count() :判断元素是否存在
st1.insert(1);
st1.erase(1);
st1.find(2);
st1.count(5);
注意事项
set 的迭代器取到的元素是只读的(因为是 const 迭代器),不可修改其值。如果要改,需要先 erase 再 insert
map 映射
提供对数时间的有序键值对结构。底层原理是红黑树。就是字典。
创建and遍历
map<int, int> mp1 = {{1, 2} ,{3, 4} }; // int->int 的映射(键从小到大)
map<int, int, greater<int>> st2; // int->int 的映射(键从大到小)
//遍历
for (map<int, int>::iterator it = mp1.begin(); it != mp1.end(); it++)
cout << it->first << ' ' << it->second << endl;
//基于范围的循环
for (auto &pr : mp1)
cout << pr.first << ' ' << pr.second << endl;
//结构化绑定+基于范围的循环
for (auto &[key, val] : mp1)
cout << key << ' ' << val << endl;
其他用法
find():查找
erase():删除
count():计数
mp1[1] = 2;
auto it = mp1.find(1); //返回的是迭代器
mp1.erase(1); //元素都是键
mp1.count(3); //元素都是键
pair二元组
//储存二元组
pair<int,int> p1;
pair<int, long long> p2;
pair<char, int> p3;
//赋值
pair<int, char> p4 = {1, 'a'};
//取值
//取第一个值 first
//取第二个值 second
int pn1 = p4.first;
char pn2 = p4.second;