【C++标准模板库】一些函数的用法(vector、set、map)

一、定义

(一)vector

vector name;“变长数组”,相当于一维数组,长度根据需要而自动改变的数组。(大部分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

集合,set name;内部自动有序且不含重复元素的容器
头文件:#include;
常见用途:
1、主要作用是自动去重并按升序排序,适用于需要去重但不方便直接开数组的情况
2、set中元素是唯一的,如果需要处理不唯一的情况,需要使用multiset

(三)map

映射,map mp;可以将任何基本类型映射到任何基本类型
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;
	}

(二)通过迭代器访问

1、vector

迭代器iterator可以理解为类似指针的东西
定义:vector::iterator it;(可通用)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区别

2、set

枚举方式

	for (set<int>::iterator it = st.begin();it != st.end();it++) {
		cout << *it << "\t";
	}

注:set的元素会自动递增排序,并且自动去除重复元素。

3、map

必须通过一个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会以键从小到大的顺序自动排序

一些常用函数

(一)insert():插入函数(vector、set、

1、向vector的任意迭代器it处插入一个元素x:insert(it,x),时间复杂度O(N)
2、向set插入一个元素x:insert(x),时间复杂度O(logN)

(二)erase():删除函数(vector、set、map)

时间复杂度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为欲删除的映射的键。

(三)clear():清空数据(vector、set、map)

时间复杂度为O(元素的个数N)

(六)find():查找数据(set、map)

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;
}

【C++标准模板库】一些函数的用法(vector、set、map)_第1张图片

你可能感兴趣的:(C++,c++,开发语言)