C++STL函数总结

1.string

string是一个字符串。

	//1.创建字符串
	string s1;//建立空串
	string s2("hello world");//初始化
	string s3(s2, 2);//用s2从第二个字符开始后面的所有字符对s3初始化(不包括第二个字符)
	string s4(s2, 2, 6);//用s2从第二个字符开始后6个字符对s4初始化(不包括第二个)
	string s5(s4);//用s4对s5初始化


	//2.容量函数
	s2.size();//不包括\0
	s2.capacity();//字符串的容量
	s2.clear();//清除字符串
	s2.reserve(100);
	cout << s2.capacity() << endl;//reserve扩展的空间是在原有字符串大小基础上扩展的,而不是在原有容量的基础上
	                              //与vector不同,vector是扩容到
	s3.resize(100,'x');//扩容并初始化,共初始化100个空间,即100-11个x
	cout << s3.size() << endl;
	cout << s3.capacity() << endl;


	//3.下标
	cout << s3[2] << endl;


	//4.插入,都是将后面数据后移,并且首元素下标都是0
	s1.push_back('a');//插入字符
	s1.append("apple");//插入字符串
	s1 += "hello world";//运算符重载,最常使用!!!
	s1.insert(0, 1, 'x');//在0的位置插入一个x
	s1.insert(s1.begin(), 'y');//在开始插入一个y
	s1.insert(4, "test");//在第四个位置插入test
	s1.erase(0, 1);//删除头处第一个字符


	//5.查找与匹配
	string file("test.txt");
	size_t pos = file.find('.');//返回第一次出现的位置(从0开始计数),失败会返回string::nops
	size_t ppos = file.find('x', 3);//从第三个位置开始找,但是还是从0开始计数,结果为6
	cout << ppos << endl;
	if (pos != string::npos)
	{
		string suffix = file.substr(pos, file.size() - pos);//截取从pos(包括pos)开始file.size()-pos长度的字符串
		cout << pos << " " << suffix << endl;//没有指定就截取后面整个内容
	}

	//6.字符串比较,和strcmp的原理一样
	cout << (s1 < s2) << endl;

	//7.字符串转换
	int val = stoi("1234");
	string str = to_string(3.14);

2.vector

vector是一个数组,可以下标访问。

	//1.vector创建数组
	vector<int> v1;//创建一个空对象
	vector<int> v11;//创建一个空对象
	vector<int> v2(10, 8);//创建有十个8的对象
	vector<int> v3(v2.begin()+1, --v2.end());//通过迭代器创建对象
	vector<int> v4(v3);//拷贝构造
	//将字符串存到vector数组中
	string a("hello world");
	vector<char> v5(a.begin(), a.end());


	//2.vector容量函数
	v2.size();//已经初始化的元素个数10
	v2.capacity();//最大容量为10


	//3.vector扩容函数
	//注意是扩容到多少,而不是扩容了多少
	v1.reserve(10);//扩容,但不进行初始化
	v1.size();//0
	v1.capacity();//10
	v11.resize(10);//扩容,并且进行初始化为0
	v11.size();//10
	v11.capacity();//10
	v2.resize(20);//之前的值不进行覆盖
	v2.size();//20
	v2.capacity();//20
	v2.assign(20, 5);//扩容为20,并将所有值覆盖为5


	//4.插入与删除
	vector<int> v6;
	v6.push_back(1);//尾插,可以自动扩容(扩容可能比插入的多)
	v6.push_back(1);
	v6.push_back(1);
	v6.pop_back();//尾删,但不改变容量
	//迭代器插入(慎用)
	//1.如果空间被重新分配,则指向容器的迭代器、指针和引用都会失效。
	//2.如果空间没被重新分配,指向插入位置之前的元素的迭代器、指针和引用依然有效,
	//但指向插入位置之后元素的带带器、指针和引用将会失效。
	vector<int>::iterator ret = v6.begin();
	v6.insert(ret, 0);//在ret位置处插入0,此时ret失效不能再使用
	v6.insert(v6.begin(), 0);//可自动扩容
	v6.erase(v6.begin());//不改变容量删除
	v6.clear();//删除所有数据,不改变容量
	cout << v6.size() << endl; cout << v6.capacity() << endl;


	//5.遍历vector
	v1.resize(10);
	//正常遍历
	for (int i = 0; i < v1.size(); i++)
	{
		v1[i] += i;
		cout << v1[i] << " ";
	}
	cout << endl;
	//迭代器遍历,将其当成指针
	vector<int>::iterator it = v1.begin();
	while (it != v1.end())
	{
		*it -= 1;
		cout << *it<<" ";
		it++;
	}
	cout << endl;
	//范围for遍历
	for (auto& e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	

	//6.二维数组
	//分两批初始化,第一次初始化多少行,第二次初始化每行多少元素
	vector<vector<int>> vv;
	vv.resize(10);
	for (auto& e : vv)
	{
		e.resize(5);
	}
	cout << vv[1][3] << endl;

3.list

list是一个双向带头循环链表,不能下标访问。

	//1.创建双向带头循环链表
	list<int> l1;//创建一个空对象
	list<int> l11;//创建一个对象
	list<int> l2(8, 1);//链表中有8个1,算头有9个节点
	list<int> l3(l2);//拷贝构造
	list<int> l4(l3.begin()++, l3.end()--);//注意不能+1,但是可以++
	

	//2.大小
	//由于是链表,所以不需要提前扩容
	//size大小不算头结点
	l1.empty();//1
	l1.size() ;//0
	l2.empty();//0
	l2.size();//8
	

	//3.插入删除
	l1.push_back(2);//尾插
	l1.push_back(2);
	l1.push_front(3);//头插
	l1.push_front(3);
	l1.pop_back();//尾删
	l1.pop_front();//头删
	auto it = l1.begin();
	l1.insert(it, 5);//在it前面插入一个5,需要注意迭代器是否失效问题
	l1.insert(it, 3, 5);//在it前面插三个5
	l1.insert(it, l2.begin(), l2.end());//将l2插在it前面
	l1.erase(it);//删除节点
	l1.erase(++l1.begin(), --l1.end());//删除中间内容

	//4.遍历
	//迭代器遍历
	list<int>::iterator cur = l3.begin();
	while (cur != l3.end())
	{
		cout <<*cur<<" ";
		cur++;
	}
	cout << endl;
	//范围for遍历
	for (auto& e : l3)
	{
		cout << e << " ";
	}
	cout << endl;

	//排序,交换,清空
	l1.sort();//从小到大排序,vector可以使用algorithm中的sort进行排序
	l1.swap(l3);//两个链表中内容进行交换
	l1.clear();//清空l1中的元素

4.set与multiset

set是只有key值的二叉搜索树。multiset是只有key值,并且可以有key值相等节点的二叉搜索树。

	//搜索二叉树的key模型,不能修改key
	//1.set建立与插入
	set<int> s;//不能插入key相同的节点
	s.insert(1);//插入的时候不会插入相同节点
	s.insert(1);
	s.insert(5);
	s.insert(3);
	s.insert(2);
	s.insert(4);


	//2.set查找与删除
	set<int>::iterator it = s.find(3);//find函数返回的是迭代器类型,没找到会返回s.end()
	if (it != s.end())//每一次删除都要对find的返回值做检测
	{
		s.erase(it);
	}
	s.erase(1);//即使传入的值不存在也不会崩溃,底层做了检测

	//3.遍历,都是进行中序遍历,即从小到大排序
	//迭代器遍历
	auto cur = s.begin();
	while (cur != s.end())
	{
		cout << *cur << " ";
		cur++;
	}
	cout << endl;
	//范围for遍历
	for (auto& e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	//4.multiset,可以有key相同的值
	multiset<int> ms;
	ms.insert(1);
	ms.insert(2);
	ms.insert(5);
	ms.insert(3);
	ms.insert(3);
	ms.insert(3);
	ms.find(3);//中序遍历的第一个3
	ms.erase(3);//删除所有的3

5.map与multimap

有kv结构的二叉搜索树,mutimap支持相同的key进行插入(value可以不同也可以相同)。

	//有kv结构的二叉搜索树
	//1.创建,map中只能存放pair类型,key不能修改,value可以修改
	map<string, string> dict;
	pair<string, string> kv1("sort", "排序");


	//2.插入删除
	dict.insert(kv1);
	dict.insert(pair<string, string>("string", "字符串"));
	dict.insert(make_pair("test", "测试"));//通常使用make_pair来进行插入
	dict.insert(make_pair("test", "检验"));//不允许有相同的key值,没有插入进去
	dict.insert(make_pair("apple", "苹果"));
	dict.erase("apple");//注意传入的是key值

	//3.下标的使用
	dict["string"] = "绳子";//可以根据key_value进行修改


	//4.遍历,每一个节点表示一个pair
	//迭代器遍历
	map<string, string>::iterator it = dict.begin();
	while (it != dict.end())
	{
		cout << (*it).first << ":" << (*it).second << endl;
		it++;
	}
	//范围for遍历
	for (auto& e : dict)
	{
		cout << e.first << ":" << e.second << endl;
	}

	//5.multimap,即可以同一个key不同的value
	multimap<string, string> dictt;
	dictt.insert(make_pair("left", "左边"));
	dictt.insert(make_pair("sort", "排序"));
	dictt.insert(make_pair("left", "左边"));
	dictt.insert(make_pair("left", "剩余"));
	dict.count("left");//2,计算left的个数
	dict.erase("left");//删除所有的left
	//注意!!!!!multimap是不支持下标访问的!!!!
posted @ 2022-10-03 15:44  卖寂寞的小男孩  阅读(3)  评论(0)    收藏  举报  来源