C++ STL API

mac2024-11-25  64

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());//并集
最新回复(0)