C++ STL API

String字符串

	//**************string**************//
	#include<string>
	//赋值
	string str = "ABC";
	str.assign("ABCD");
	//增
	str.append("EF");
	str += "GH";
	//读
	char c = s[5];//越界崩溃
	c = s.at(5);//越界抛异常
	string s=str.substr(2,3);//取2位起始,长度为3的字符串
	//查
	int f = s.find("C");//正序
	int g = s.rfind("F");//逆序
	int size=s.size();//长度
	str.insert(3, "A");//插入	
	str.erase(2, 5);//删除	
	str.replace(2, 5, "B");//替换
	//大小写
	c = toupper(c);
	c = tolower(c);
	//**************string**************//

Vector动态数组

单端数组,双向迭代器,随机存取
内存动态扩充,复制到内存中足够大的位置后删掉原来的数据

    #include<vector>
    //**************vector**************//
	//构造
	vector<int> v1;
	vector<int> x(10, 0);//10个0
	vector<int> p(x);//copy
	vector<int> y(x.begin(), x.end());//copy
	vector<vector<int>> v(m, vector<int>(n, 0)); //m*n的二维数组,所有元素初始化为0
	//赋值
	vector<int> v2 = v1;
	v1.assign(x.begin(), x.end());
	v1.assign(10, 0);//10个0
	v1.swap(v2);//交换
	//遍历
	for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
	{
		cout << *it << " ";
	}
	//大小操作
	v1.size();//大小
	v1.empty();//true为空
	v1.resize(10);//重新指定容器长度为10(大于填充0,小于删除)
	v1.resize(10,100);//100默认填充值
	v1.capacity();//容量
	//读取
	v1[0];
	v1.at(0);
	v1.front();
	v1.back();
	//插入
	v1.insert(v1.begin(), 66);//传入迭代器
	v1.push_back(10);
	//删除
	v1.pop_back();//尾删
	v1.erase(v1.begin(), v1.begin() + 2);//区间删
	v1.clear();//清空
	//收缩空间
	vector<int>(v1).swap(v1);//vector<int>(v1)复制匿名对象
	//预留空间
	v1.reserve(10000);//一次扩充避免多次扩充内存
    //**************vector**************//

Deque动态数组

双端数组,双向迭代器,随机存取
没有容量,容量扩充时不连续,表维护内存

	#include<deque>
    //**************deque**************//
	deque<int> d;
	//增
	d.push_front(10);
	//删
	d.pop_front();
	//**************deque**************//

Stack栈/Queue队列

没有迭代器

	#include<stack>
	#include<queue>
    //**************stack**************//
	stack<int> s;
	//增
	s.push(10);
	//删
	s.pop();
	//栈顶
	s.top();
	//**************stack**************//
	//**************queue**************//
	queue<int> q;
	//增
	q.push(10);
	//删
	q.pop();
	//队头
	q.front();
	//**************queue*************//

List链表

双向循环链表,不支持随机存取

	#include<list>
    //**************list*************//
    bool my_sort(int p1, int p2) { return p1 > p2; }
	list<int> L;
	L.push_back(30);
	L.push_back(40);
	L.push_back(7000);
	L.push_front(100);
	L.reverse();//反转
	L.remove(100);//删除所有=100的值
	L.sort();//从小到大
	L.sort(my_sort);//修改排序为从大到小
	//**************list*************//

Set/Multiset集合

内部由红黑树实现,自动排序(二叉排序树,默认从小到大)
Set键值唯一,Mutiset键值可重复,不允许根据迭代器修改键值,只能增/删

	#include<set>//包含set和multiset
    //**************set/mutiset*************//
	set<int> st;
	st.insert(10);
	st.insert(20);
	st.insert(30);
	st.erase(200);//按值
	st.erase(st.begin());//按迭代器
	set<int>::iterator it=st.find(30);//按值,返回迭代器,失败返回end
	int c=st.count(30);//统计个数
	it = st.lower_bound(20);//返回>=20的迭代器
	it = st.upper_bound(20);//返回>20的迭代器
	pair<set<int>::iterator, set<int>::iterator> p;//对,第一个low,第二个up
	p = st.equal_range(20);
	*p.first;//>=20的迭代器
	*p.second;//>20的迭代器
	//pair构造
	pair<int, double> p(10, 20.0);
	pair<int, string> p = make_pair(10, "A");
class Person
{
public:
	int m_age;
	string m_name;
	Person(int age, string name)
	{
		this->m_age = age;
		this->m_name = name;
	}
};
class person_compare
{
public:
    //改变排序规则,从大到小<
	bool operator()(const Person& p1, const Person& p2) const {return p1.m_name < p2.m_name;}
};
	//set存放自定义类数据,先指定排序规则
    set<Person, person_compare> s;
	Person p1(10, "a");
	Person p2(60, "b");
	Person p3(30, "c");
	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	for (set<Person, person_compare>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << "Name " << it->m_name << "  Age " << it->m_age << endl;
	}
	//**************set/mutiset*************//

Map/Multimap

存放键值对,key和set类似
Map键值唯一,Multimap键值可重复

	#include<map>//包含map和multi
    map<int, int> m;
	//插入
	m.insert(pair<int, int>(1, 10));
	m.insert(make_pair(2, 20));//√
	m.insert(map<int, int>::value_type(3, 30));//不建议使用
	m[4] = 40;//不建议使用
	//删除
	m.clear();
	m.erase(4);//按key删除
	//查找
	auto pos = m.find(3);//返回迭代器
	int counter = m.count(3);//统计

Algorithm

	#include<algorithm>
	//遍历
	for_each(v.begin(), v.end(), [](int val) {cout << val << endl; });//Lambda表达式
	//回调函数
	void my_print(int val){cout << val<<" ";}
	for_each(v.begin(), v.end(),my_print);//无括号
	#include<functional>//适配器用
	//函数对象+适配器(增加参数)	
	class print:public binary_function<int,int,void>//继承binary_function 参数<参数1类型,参数2类型,返回类型>
	{
	public:
		void operator()(int val, int start) const{cout << val + start << endl;}//注意const
	};
	for_each(v.begin(), v.end(), bind2nd(print(),100));
	//统计"X"的个数
	int c=count(v.begin(), v.end(), "X");
	//统计满足条件 >30的个数
	int d = count_if(v.begin(), v.end(), [](int val)->bool {return val > 30; });
	//检索5,返回5的位置,失败返回v.end(),返回类型 迭代器
	auto pos = find(v.begin(), v.end(), 5);
	//检索满足条件的值,同上
	auto pos = find_if(v.begin(), v.end(), [](int val) {return val > 5; });
	//排序(从小到大)
	sort(v.begin(), v.end());
	//排序(从大到小)
	sort(v.begin(), v.end(), [](int v1, int v2) {return v1 > v2; });//Lambda表达式
	//合并,需要外部容器
	vector<int> target;
	//改变外部容器的容量
	target.resize(v1.size()+v2.size);
	//合并的两个容器必须有序
	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), target.begin());
	#include<ctime>
    //打乱排序
	srand((unsigned int)time(NULL));//随机种子
	random_shuffle(v.begin(), v.end());
	//逆序
	reverse(v.begin(), v.end());
	//v0分配大小
	v0.resize(v.size());
	//复制
	copy(v.begin(), v.end(), v0.begin());
	//替换	旧值,新值
	replace(v.begin(), v.end(), 10, 8000);
	//替换	满足条例,新值
	replace_if(v.begin(), v.end(), [](int val)->bool {return val > 50; }, 8000);
	//交换
	swap(v, v0);
	#include<numeric>
	//累加求和
	int a=accumulate(v.begin(), v.end(), 0);//初始值0
	v.resize(10);
	//全部填充
	fill(v.begin(), v.end(), 810);
	v2.resize(min(v.size(), v0.size()));//开辟空间
	//容器必须有序 返回迭代器最后一个的位置
	auto it_end=set_intersection(v.begin(), v.end(), v0.begin(), v0.end(), v2.begin());//交集
	v2.resize(max(v.size(), v0.size()));
	auto it_end = set_difference(v.begin(), v.end(), v0.begin(), v0.end(), v2.begin());//差集
	v2.resize(v.size() + v0.size());
	auto it_end = set_union(v.begin(), v.end(), v0.begin(), v0.end(), v2.begin());//并集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值