STL常见容器的使用
一、vector
6种初始化方式, 4种遍历方式,删除
1、初始化和遍历
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 初始化1:
vector<int> vector1;
vector1.push_back(1);
// 初始化2:
vector<int> vector2(vector1);
// 初始化3:
vector<int> vector3(vector1.begin(), vector1.end() - 1);
// 初始化4:
vector<int> vector4(7);
// 初始化5:
vector<int> vector5(7, 100);
// 初始化6:
vector<int> vector6 = {1, 2, 3, 4};
// 遍历1: 下标
cout << "第一种遍历方式,下标访问" << endl;
for (int i = 0; i < vector1.size(); ++i)
{
cout << vector1[i] << endl;
}
// 遍历2: 迭代器
cout << "第二种遍历方式,迭代器访问" << endl;
for (vector<int>::iterator iter = vector2.begin(); iter != vector2.end(); iter++)
{
cout << (*iter) << endl;
}
// 遍历3: auto关键字
cout << "C++11,第三种遍历方式,auto关键字" << endl;
for (auto iter = vector3.begin(); iter != vector3.end(); iter++)
{
cout << (*iter) << endl;
}
// 遍历4: auto关键字
cout << "C++11,第四种遍历方式,auto关键字" << endl;
for (auto i : vector5)
{
cout << i << endl;
}
return 0;
}
2、删除
1)、pop_back()
做了2件事:
- 1 将队尾的元素移除,释放最后一个元素的空间;
- 2 vector.size() --;
2)、erase()
https://www.cnblogs.com/chaohacker/p/13024357.html
典型错误1
vector<int> test{1,2,2,3};
for(vector<int>::iterator test_iterator = test.begin(); test_iterator != test.end(); test_iterator++)
{
if(*test_iterator == 2) {
test.erase(test_iterator);
}
}
典型错误2
for(vector<int>::iterator test_iterator = test.begin(); test_iterator != test.end();)
{
if(*test_iterator == 2) {
test.erase(test_iterator++);
}
else {
test_iterator++;
}
}
正确写法
for(vector<int>::iterator test_iterator = test.begin(); test_iterator != test.end();)
{
if(*test_iterator == 2) {
test_iterator = test.erase(test_iterator);
}
else {
test_iterator++;
}
}
3、remove()
二、set
https://www.cnblogs.com/linuxAndMcu/p/10261014.html
1 查询操作
set<int> my_set = {1,2,3,4,5,6}
set<int>::iterator iter = my_set.find(1);
三、map
四、unordered_map
该容器和java中的hashMap一致;
1、4种新建容器的方法
#include <unordered_map>
#include <string>
int main()
{
// 第1种 创建空容器
std::unordered_map<std::string, std::string> my_map1;
// 第2种 初始化
std::unordered_map<std::string, std::string> my_map2{{"1", "A"},
{"2", "B"},
{"3", "C"}};
// 第3种 复制
std::unordered_map<std::string, std::string> my_map3 = my_map2;
// 第4种 迭代器复制
std::unordered_map<std::string, std::string> my_map4(my_map2.begin(), my_map2.end());
return 0;
}
2、常用操作
#include<iostream> //map的基本操作如下
#include<map>
#include<string>
using namespace std;
int main()
{
// 构造函数
map<string, int> dict;
// 插入数据的三种方式
dict.insert(pair<string,int>("apple",2));
dict.insert(map<string, int>::value_type("orange",3));
dict["banana"] = 6;
// 判断是否有元素
if(dict.empty())
cout<<"该字典无元素"<<endl;
else
cout<<"该字典共有"<<dict.size()<<"个元素"<<endl;
// 遍历
map<string, int>::iterator iter;
for(iter=dict.begin();iter!=dict.end();iter++)
cout<<iter->first<<ends<<iter->second<<endl;
// 查找
if((iter=dict.find("banana"))!=dict.end()) // 返回一个迭代器指向键值为key的元素,如果没找到就返回end()
cout<<"已找到banana,其value为"<<iter->second<<"."<<endl;
else
cout<<"未找到banana."<<endl;
if(dict.count("watermelon")==0) // 返回键值等于key的元素的个数
cout<<"watermelon不存在"<<endl;
else
cout<<"watermelon存在"<<endl;
pair<map<string, int>::iterator, map<string, int>::iterator> ret;
ret = dict.equal_range("banana"); // 查找键值等于 key 的元素区间为[start,end),指示范围的两个迭代器以 pair 返回
cout<<ret.first->first<<ends<<ret.first->second<<endl;
cout<<ret.second->first<<ends<<ret.second->second<<endl;
iter = dict.lower_bound("boluo"); // 返回一个迭代器,指向键值>=key的第一个元素。
cout<<iter->first<<endl;
iter = dict.upper_bound("boluo"); // 返回一个迭代器,指向值键值>key的第一个元素。
cout<<iter->first<<endl;
return 0;
}
#include<string>
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
unordered_map<string, int> dict; // 声明unordered_map对象
// 插入数据的三种方式
dict.insert(pair<string,int>("apple",2));
dict.insert(unordered_map<string, int>::value_type("orange",3));
dict["banana"] = 6;
// 判断是否有元素
if(dict.empty())
cout<<"该字典无元素"<<endl;
else
cout<<"该字典共有"<<dict.size()<<"个元素"<<endl;
// 遍历
unordered_map<string, int>::iterator iter;
for(iter=dict.begin();iter!=dict.end();iter++)
cout<<iter->first<<ends<<iter->second<<endl;
// 查找
if(dict.count("boluo")==0)
cout<<"can't find boluo!"<<endl;
else
cout<<"find boluo!"<<endl;
if((iter=dict.find("banana"))!=dict.end())
cout<<"banana="<<iter->second<<endl;
else
cout<<"can't find boluo!"<<endl;
return 0;
}