C++ STL常用方法 ——vector、map、set、unordered_map、unordered_set
一、map
1.map简介
map是一种关联式容器,一对一的映射
- 第一个是key,是唯一的。
- 第二个是value,关键字所对应的值。
因为map的底层实现是红黑树,所以map会对插入的数据进行排序。
2.插入元素
采用insert和直接下标访问两种方式,同时可以看到输出是按照key值排序。
#include"map" int main() { map<int,string> um; um.insert(pair<int,string>(2,"steve")); um[1]="antonio"; //访问方式,可以看到插入的元素最后会按照key值排序 for (auto item:um) { cout<<item.first<<" "<<item.second<<endl; } //1 antonio //2 steve return 0; }
3.查找元素
查找key出现的位置,如果没有在map中,则返回end(指向尾部的迭代器)
#include"map" int main() { map<int,string> um; um.insert(pair<int,string>(2,"steve")); um[1]="antonio"; if(um.find(2)!=um.end()) cout<<"have found"<<endl; else cout<<"not found"<<endl; return 0; }
4.map常用成员方法
begin() 返回指向map头部的迭代器
end() 返回指向map末尾的迭代器
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
erase() 删除一个元素
find() 查找一个元素
insert() 插入元素
lower_bound() 返回键值>=给定元素的第一个位置
size() 返回map中元素的个数
5.map和unordered_map比较
在数据量小的时候,unordered_map比map慢
二、set
1.set简介
set只保存一个元素,就是key。
set底层实现同样是红黑树,故而内部数据是会排序好。
2.set的插入和遍历
采用insert方法插入。
#include"set" int main() { set<int> us; us.insert(3); us.insert(1); us.insert(2); //1 2 3 for (auto item:us) { cout<<item<<" "; } return 0; }
3.set常用成员方法
begin() 返回set容器的第一个元素
end() 返回set容器的最后一个元素
rbegin() 返回的值和end()相同
rend() 返回的值和rbegin()相同
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
size() 返回当前set容器中的元素个数
三、 unordered_map
1.简介
unordered_map是一种关联式容器,一对一的映射
- 第一个是key,是唯一的。
- 第二个是value,关键字所对应的值。
底层实现是hash表,故而其内的元素是无序的。
其中hash是使用的拉链法解决冲突。如下图所示
2.元素初始化
插入有常用的两种方式,赋值常用量两种方式。
#include"unordered_map" #include "iostream" using namespace std; //对unordered_map<int,string>使用别名int_string typedef unordered_map<int,string> int_string; int main() { //初始化的几种方法 int_string one={{3,"bash"},{1,"java"}}; one[4]="python";//直接下标插入元素 one.insert(pair<int,string>(2,"c++"));//使用成员方法insert插入元素 int_string two ( one ); // 用数组初始 int_string three ( two.begin(),two.end()); // 范围初始化 //访问方式 for (auto item:three) { cout<<item.first<<" "<<item.second<<endl; } return 0; }
3.常用成员方法
begin() 指向第一个元素
end() 指向最后一个元素的迭代器
empty() 判别是否为空
size() 所有键值对的数量
insert() 插入一对元素
erase() 删除指定的键值对
find() 查找元素,如果存在返回的是key值对应的迭代器,如果不存在返回的是end()
四、 unordered_set
1.简介
只保存关键词key
底层实现是hash表,故而其内的元素是无序的。
2.数据初始化
#include"iostream" #include"unordered_set" using namespace std; typedef unordered_set<int> US; int main() { US us; us.insert(2); us.insert(1); US one(us);//one=us;是等价的 US two(one.begin(),one.end()); //访问方式 for (auto item:two) { cout<<item<<endl; } return 0; }
五、vector
1.简介
vector是序列式容器,按照下表访问。
2.数据初始化
含有一维数组和二维数组的初始化
#include"vector" using namespace std; typedef vector<int> Vector; int main() { Vector vec(10,5); Vector vec1(vec); //Vector vec1=vec这两种方式是等价的 Vector vec2(vec.begin(),vec.end()); Vector vec3={1,2,3,4}; Vector vec4(10);//初始化数组的大小是10,value是0 Vector vec5(10,1);//初始化数组的大小是10,value是1 //二维矩阵的初始化 vector<vector<int>> ans(12,vector<int>(10,0)); vector<vector<int>> ans1(ans); return 0; }
3.常用成员方法
begin() 指向第一个元素的迭代器
end() 指向最后一个元素的下一个位置的迭代器
empty() 判别是否为空
size() 存储的数据量
insert() 插入元素
push_back() 在尾部插入元素
pop_back() 将尾部元素弹出
#include"iostream" #include"vector" using namespace std; typedef vector<int> Vector; int main() { Vector vec; vec.push_back(1);//push元素到末尾 vec.push_back(2); vec.push_back(3); vec.insert(vec.begin()+1,-1); //1 -1 2 3 for (int i = 0; i < vec.size(); ++i) { cout<<vec[i]<<" "; } vec.pop_back();//将元素弹出 //1 -1 2 for (int i = 0; i < vec.size(); ++i) { cout<<vec[i]<<" "; } return 0; }