vector
“变长数组”,相当于一维数组,长度根据需要而自动改变的数组。(大部分STL都是这样定义)
头文件:#include
在头文件下方要添加using namespace std;
(都要加)
typename也是一个STL容器,可以是任何的基本类型。
vector<int> n;
vector<char> m;
vector<node> a;
//是vector类型时,>>之间要有空格,不固定长度
vector<vector<int> > name;
//vector数组,固定长度
vector<int> vi[10];
1、push_back(x);
在vector后面加上一个元素x,时间复杂度:O(1);
2、pop_back();
删除vector的尾元素,时间复杂度:O(1);
for (int i = 0;i < 10;i++) {
vi.push_back(i * 10);
}
vi.pop_back();
常见用途:
1、存储数据,vector本身可以作为数组使用,在一些元素个数不确定的场合可以很好的节省空间。有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。由于数据个数不确定,为了更方便处理最后一个满足条件的数据后面不输出额外的空格,可以先用vector记录所有需要输出的数据,然后一次性输出。
2、用邻接表存储图
集合,set
内部自动有序且不含重复元素的容器
头文件:#include
常见用途:
1、主要作用是自动去重并按升序排序,适用于需要去重但不方便直接开数组的情况
2、set中元素是唯一的,如果需要处理不唯一的情况,需要使用multiset
映射,map
可以将任何基本类型映射到任何基本类型
typename1是键的类型,typename2是值的类型
头文件:#include
//字符串到整型的映射必须用string,不可以用char数组
map<string, int> mp;
//键和值也可以是STL容器
map<set<int>, string> mp1;
常见用途:
1、需要建立字符或字符串与整数之间映射时,可以使用map减少代码量。
2、判断大整数其他类型数据是否存在时,可以把map当bool数组使用。
3、字符串和字符串的映射
4、set中键和值是唯一的,如果一个键需要对应多个值,需要使用multimap
map
void mapTest() {
//字符串到整型的映射必须用string,不可以用char数组
map<string, int> mp;
map<char, int> mp2;
set<int> st;
//键和值也可以是STL容器
map<set<int>, string> mp1;
mp2['c'] = 20;
mp["abc"] = 30;
mp1[st] = "abc";
cout << mp2['c'] << "\n" << mp["abc"] << "\n" << mp1[st]<<endl;
}
vector
vector<int> vi = { 0,1,2,3,4,5,6,7,8,9 };
for (int i = 0;i < vi.size();i++) {
cout << vi[i] << endl;
}
迭代器iterator可以理解为类似指针的东西
定义:vector
(可通用)type::iterator it
vector<int> vi = { 0,1,2,3,4,5,6,7,8,9 };
for (int i = 0;i < 10;i++) {
vi.push_back(i * 10);
}
vi.pop_back();
vector<int>::iterator it = vi.begin();
for (it;it != vi.end();it++) {
cout << *it << endl;
}
注:vi[i]==*(vi.begin())
begin():取首元素地址。
end():取尾元素地址的下一个地址,作为迭代器末尾标志,不存储任何元素。不支持it < vi.end();
写法(都不)
在常用的STL容器中,只有vector和string中才允许使用vi.begin()+n
或*(it+i)
这种迭代器+整数的写法,string的使用详情在另一章中:C和C++的string区别
枚举方式
for (set<int>::iterator it = st.begin();it != st.end();it++) {
cout << *it << "\t";
}
注:set的元素会自动递增排序,并且自动去除重复元素。
必须通过一个it同时访问键和值,可以使用it->first
访问键,it->second
访问值。
mp2['c'] = 10;
mp2['b'] = 30;
mp2['a'] = 20;
for (map<char,int>::iterator it = mp2.begin();it != mp2.end();it++) {
cout << it->first << "\t" << it->second << endl;;
}
注:map会以键从小到大的顺序自动排序
1、向vector的任意迭代器it处插入一个元素x:insert(it,x)
,时间复杂度O(N)
2、向set插入一个元素x:insert(x)
,时间复杂度O(logN)
时间复杂度O(N)
1、删除单个元素,vi.erase(it)
,it为需要删除的元素的迭代器。(通用)
2、删除一个区间内的所有元素,vi.erase(first,last)
,first为起始值,last为需要删除区间的末尾的下一个地址。(通用)
3、如果要删除vector内的所有元素是:vi.erase(vi.begin(),vi.end());
4、删除set中的单个元素:st.erase(value)
,value为需要删除的元素值
5、删除map中的单个元素:mp.erase(key);key为欲删除的映射的键。
时间复杂度为O(元素的个数N)
1、返回set中对应值为value的迭代器:st.find(value);
,时间复杂度O(logN)
2、返回map中返回键为key的映射的迭代器:mp.find(key);
,时间复杂度O(logN)
void vectorTest() {
vector<int> n;
vector<char> m;
vector<node> a;
//是vector类型时,>>之间要有空格,不固定长度
vector<vector<int> > name;
//vector数组,固定长度
vector<int> vi ;
for (int i = 0;i < 10;i++) {
vi.push_back(i * 10);
}
vi.pop_back();
vector<int>::iterator it = vi.begin();
for (it;it != vi.end();it++) {
cout << *it <<"\t";
}
vi.clear();
cout << endl;
cout<<"清空后vi的个数" << vi.size() << endl;
vi = { 1,2,3,4,5 };
vi.insert(vi.begin(), 10);
vi.insert(vi.begin()+1, 60);
vi.erase(vi.begin()+2);
vi.erase(vi.begin() + 3, vi.begin() + 5);
vi.push_back(100);
for (int i = 0;i < vi.size();i++) {
cout << vi[i] << "\t";
}
}
void setTest() {
set<int> st;
for (int i = 0;i < 10;i++) {
st.insert(i*20);
}
set<int>::iterator f = st.find(20);
cout <<"查找20的位置" << *f << endl;
cout << "查找40的位置" << *(st.find(40)) << endl;
st.erase(f);
st.erase(100);
st.erase(st.find(160), st.end());
cout << "删除一些元素后的数据个数:" << st.size()<<endl;
for (set<int>::iterator it = st.begin();it != st.end();it++) {
cout << *it << "\t";
}
st.clear();
cout << endl;
cout << "清除元素后的数据个数:" << st.size() << endl;
}
void mapTest() {
//字符串到整型的映射必须用string,不可以用char数组
map<string, int> mp;
map<char, int> mp2;
set<int> st;
//键和值也可以是STL容器
map<set<int>, string> mp1;
mp2['c'] = 10;
mp2['b'] = 30;
mp2['a'] = 20;
mp2['d'] = 40;
mp2['f'] = 50;
mp2['g'] = 60;
mp["abc"] = 100;
mp1[st] = "abc";
for (map<char,int>::iterator it = mp2.begin();it != mp2.end();it++) {
cout << it->first << "\t" << it->second << endl;;
}
cout << "数据个数:" << mp2.size()<< endl;
map<char, int>::iterator it = mp2.find('a');
cout << "查找的数据:" << it->first << "\t" << it->second << endl;
mp2.erase(it);
mp2.erase(30);
mp2.erase(mp2.find('f'), mp2.end());
cout << "删除一些元素后个数:" << mp2.size() << endl;
for (map<char, int>::iterator it = mp2.begin();it != mp2.end();it++) {
cout << it->first << "\t" << it->second << endl;;
}
mp2.clear();
cout << "清空后元素个数:" << mp2.size() << endl;
cout << mp2['c'] << "\n" << mp["abc"] << "\n" << mp1[st]<<endl;
}