vector
vector为可变长数组,可以随时添加数据和删除元素。
一维初始化
cpp
vector<int> a;
指定长度和初始值的初始化
cpp
vector<int> v(n);//定义长度为n的数组,初始值默认为0,下表范围[0,n-1]
vector<int> v(n,1);//所有元素初始值为1
初始化当中有多个元素
cpp
vector<int> a{1,2,3,4,5,6};
拷贝初始化
cpp
vector<int> a(n,1);
vector<int> b=a;
vector<int> c(a);
二维初始化
cpp
vector<int> v[5];
v[1].push_back(1);
一共五行,不可变,列可变
可变行列
cpp
vector<vector<int>> v;
vector<int> t1{1,2,3,4};
vector<int> t2{4,5,7,8};
v.push_back(t1);
v.push_back(t2);
可变行列
cpp
vector<vector<int>) a(n+1,vector<int>(m+1,0));//固定m+1行,n+1列为0
注意:end()返回的是最后一个元素后一个位置的地址,所有的STL容器均是如此
使用v.resize(n,v);的时候,如果v之前指定大小为pre
如果pre>n,数组会保留前n位元素,前n个元素仍然保留原来的值
如果pre<n,前n位仍然保持原来的元素
元素访问
下标法:和普通数组一样
迭代器法
cpp
vector<int> v;
vector<int>::iterator it=v.begin();
for(int i=0;i<5;i++)
{
cout<<*(it+i)<<endl;//迭代器访问方式一
}
vector<int<::iterator it;
for(it=v.begin();it!=v.end();++it)
{
cout<<*it<<endl;
}
for(int i=0;i<5;i++)
{
cout<<v[i]<<endl;//元素下标访问
}
智能指针
auto能够自动识别类型
cpp
//输入
vector<int> a(n);
for(auto &x:a)
{
cin>>x;
}
//输出
vector<int> v;
v.push_back(12);
v.push_back(23);
for(auto val:v)
{
cout<<val<<" ";//输出12 23
}
v[i]与*(v.begin()+i)等价,与指针同理
map
每个键对应一个值
初始化
cpp
mp<sreing,string> mp;
mp<string,int> mp;
map会按照键的大小,从小到大自动排序
迭代器正向遍历
cpp
map<int,int> mp;
mp[1]=2;
mp[2]=3;
mp[3]=4;
auto it=mp.begin();
while(it!=mp.end())
{
cout<<it->first<<" "<<it->second<<"\n";
++it;
}
添加元素:
方式一:
cpp
mp["学习"]="看书";
方式二:
插入元素
cpp
mp.insert(make_pair("head","头"));
方式三:
cpp
mp.insert(pair<string,string>("fruit","水果"));
方式四:
cpp
mp.insert({"haha","wawa"});
遍历访问:
方式一:迭代器遍历
cpp
map<string,string>::iterator it;
for(it=map.begin();it!=map.end();++it)
{
cout<<it->first<<" "<<it->second<<"\n";
}
方式二:智能指针访问
cpp
for(auto it:mp)
{
cout<<it.first<<" "<<it.end<<endl;
}
方式三:
对单个元素访问
cpp
map<string,string>::iterator it=mp.find("a");
cout<<it->first<<" "<<it->second;
与unordered_map的比较
map:内部用红黑树实现,具有自动排序的功能
unordered_map:内部用哈希表实现,内部元素杂乱无序
set
set当中的元素不会重复,并且元素从小到大排列
初始化定义
cpp
set<int> s;
元素访问
迭代器访问
cpp
for(set<int>::iterator=it=s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
智能指针
cpp
for(auto i:s)
{
cout<<i<<endl;
}
访问最后一个元素
第一种
cpp
cout<<*s.rbegin()<<endl;
第二种
cpp
set<int> iterator::it=s.end();
it--;
cout<<(*it)<<endl;
第三种
cpp
cout<<*(--s.end())<<endl;
重载<运算符
改变set排序,set当中默认用less比较器
cpp
set<int> s1;//默认从小到大排序
set<int,greater<int>> s2;//从大到小排序
multiset
元素可以重复,并且元素有序
进行删除操作时,需要明确删除的目标
使用s.erase(val);时,会删除与val相同的所以元素。如果需要删除单个元素,需要使用s.erase(s.find(val));先找到一个与val相等的元素迭代器,专门删除这个元素
pair
pair只有两个元素,可以看作只有两个元素的结构体
第一个应用就是替代二元结构体,第二个就是作为map键值对插入
cpp
pair<string,int> p("lisi",1);//带初始值
pair<string,int> p;//不带初始值
//赋值
p={"li",1};
p=make_pair("wang",2);
p=pair<string,int>("wang",2);
访问
cpp
pair<int,int> p[20];
for(int i=0;i<=20;i++)
{
cout<<p[i].first<<" "<<p[i].second;
}
string
cpp
string str1;//生成空字符串
string str2("12345");
string str3("12345",0,3);//结果为123,从0位置开始,长度为3
string str4("12345",4);//结果为1234
string str5(5,'2');//结果为22222
string str6(str2,2);//结果为345
访问单个字符
cpp
string s="hello";
for(int i=0;i<s.size();i++)
{
cout<<s[i]<<endl;
}
string特性
支持比较运算符。按字典顺序比较,字典顺序靠前的字符小,靠后的大。遇到不相等的位置比较。
支持+运算符进行拼接。
getline(cin,s);会获取前一个换行的字符,需要在前面添加获取换行的语句。getline(cin,s);会获取前一个输入的换行符,需要在前面添加获取换行符的语句,getchar()或cin,get()
stack
STL当中先进后出,后进先出的容器。
cpp
stack<int> s;
栈遍历
栈只能对栈顶进行操作,所以如果要想进行遍历,就必须将栈中的元素一个个取出来放进数组里
cpp
stack<int> st;
for(int i=0;i<10;++i)
{
st.push(i);//元素入栈
}
while(!st.empty())
{
int st=s.top();//取出栈顶元素
s.pop();//移除栈顶元素
}
数组模拟栈进行遍历
通过一个数组对栈进行模拟,一个存放下标的变量top模拟栈顶的指针
cpp
int s[100];
int tt=-1;//tt代表栈顶指针,初始栈内无元素,tt为负一
for(int i=0;i<=5;++i)
{
s[++tt]=i;
}
//出栈
int top_element=s[tt--];
queue
队列是一种先进先出的数据结构
cpp
queue<int> q;
deque
首尾都可以插入删除的队列称为双端队列
priority_queue
优先队列是在正常队列的基础上加了优先级,保证了每次队首的元素优先级都是最大的
底层是通过堆实现的
list
list的底层是带头双向循环列表
cpp
list<int> l1;
list<int> l2(10,2);//构造10个2的int类型资源
list<int> l3(l2);
string s("hello");
list<char> l4(s.begin(),s.end());