C++STL常见用法
1、string
概念:相当于char*的封装,理解为字符串
1.1.简单使用
/**C中定义字符串以及打印*/ char *ch="asdkajbf"; for(int i=0;ch[i]!='\0';i++) cout<<*(ch+i); /**C++中*/ string s="ssadaffw"; cout<<s<<endl;
1.2.获取一行字符串及长度
用cin读入字符串的时候,是以空格为分隔符的,如果想要读入一整行的字符串,就需要用getline
s 的长度可以用s.length() 获取(有几个字符就是长度多少,不存在char[] 里面的什么末尾的结束之类的)
string s; // 定义一个空字符串s getline(cin, s); // 读取一行的字符串,包括空格 cout << s.length(); // 输出字符串s的长度
1.3.+=运算符
+=对于字符串、字符有效,数字会转为asc码
1.4.排序(使用algorithm头文件)
string s="5418340"; sort(s.begin(),s.end()); cout<<s;
1.5.insert函数
string &insert(int p0, const char *s);——在p0位置插入字符串s
string &insert(int p0, const char *s, int n);——在p0位置插入字符串s的前n个字符
string &insert(int p0,const string &s);——在p0位置插入字符串s
string &insert(int p0,const string &s, int pos, int n);——在p0位置插入字符串s从pos开始的连续n个字符
string &insert(int p0, int n, char c);//在p0处插入n个字符c
iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置
void insert(iterator it, const_iterator first, const_iteratorlast);//在it处插入从first开始至last-1的所有字符
void insert(iterator it, int n, char c);//在it处插入n个字符c
string str="to be question"; string str2="the "; string str3="or not to be";
string::iterator it; str.insert(6,str2); // to be (the )question str.insert(6,str3,3,4); // to be (not )the question str.insert(10,"that is cool",8); // to be not (that is )the question str.insert(10,"to be "); // to be not (to be )that is the question str.insert(15,1,':'); //加一个'.' to be not to be(:) that is the question it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question str.insert (str.end(),3,'.'); // to be, not to be: that is the question(...) str.insert (it+2,str3.begin(),str3.begin()+3); // to be, (or )not to be: that is the question...
1.6.erase函数
/*begin是头迭代器,end是尾迭代器*/ string s="5418340"; s.erase(s.begin());//删除第一个 s.erase(--s.end());//删除最后一个 cout<<s;
1.7.substr函数
string s2=s.substr(4); // 表示从下标4开始一直到结束 string s3=s.substr(5,3); // 表示从下标5开始,3个字符
1.8.循环(3种)
1.for循环
string s="5418340"; for(int i=0;i<s.length();i++) cout<<s[i];
2.迭代器
for(string::iterator it=s.begin();it!=s.end();it++) cout<<*it;
3.迭代器化简
for(auto it=s.begin();it!=s.end();it++) cout<<*it;
4.利用C++ 11新特性for循环
for(auto x:s) cout<<x;
2、动态数组vector(矢量)
概念:vector相当于数组,模板类型相当于存放的内容
1.vector构造
vector<int> v1;//定义一个空vector vector<int> v2(4);//定义一个4个大小的vector,初始为0 vector<int> v3(4,6);//定义一个4个大小的vector,初始为6 vector<int> v4{1,2,3,4,5};//定义一个vector,数字为1,2,3,4,5
2.用at或者[]获取元素
vector<int> v{1,2,3,4,5}; cout<<v[1];//输出为2 cout<<v.at(2);//输出为3
3.方法
- push_back追加内容
vector<int> v; v.push_back(5); v.push_back(5); v.push_back(5); v.push_back(5); v.push_back(6);
for(auto x:v) cout<<x<<" "; -
resize进行重置大小
v.resize(10);//不赋值默认为0
- erase删除元素,复杂度为O(n)
v.erase(v.begin());//删除第一个元素 v.erase(--v.end());//删除最后一个元素
- 获取第一个元素,获取最后一个元素
/**获取第一个元素*/ cout<<v.front(); cout<<v[0]; cout<<*v.begin(); /**获取最后一个元素*/ cout<<v.back(); cout<<v[v.size()-1];//size是获取大小 cout<<*--v.end();
4.排序
sort函数第三个参数为比较器,不写默认为less<int>()
vector<int> v{5,1,2,5,4,0,-1}; sort(v.begin(),v.end(),less<int>());//从小到大 sort(v.begin(),v.end(),greater<int>());//从大到小排序 for(auto x:v) cout<<x;
5.循环
vector<int> v{5,1,2,5,4,0,-1}; for(int i=0;i<v.size();i++) cout<<v[i]<<" ";//for循环 cout<<endl; for(vector<int>::iterator it=v.begin();it!=v.end();it++) cout<<*it<<" ";//迭代器循环 cout<<endl; for(auto it=v.begin();it!=v.end();it++) cout<<*it<<" ";//迭代器简化循环 cout<<endl; for(auto x:v) cout<<x<<" ";//c++11新特性 cout<<endl;
3、STL——stack
概念:栈(先进后出)
- 构造
stack<int> s;
- push、pop、size、empty
- push 入栈一个元素
- pop 出栈一个元素(无返回值)
- top 访问栈顶元素
- size 查看元素个数
s.push(2); s.push(3); cout<<s.top()<<endl; //3 s.pop(); cout<<s.top()<<endl; //2 cout<<s.size()<<endl;
-
进制转换(十进制转二进制)
int itob(int decimal){ stack<int> s;int res=0; while(decimal!=0){ s.push(decimal%2); decimal/=2; } while(!s.empty()){ res=res*10+s.top(); s.pop(); } return res; }
-
逆序单词(拓展sstream)
输入一行字符串,将字符串逆序打印
输入:hello world my name is yi
输出:yi is name my world hello
#include <iostream> #include <stack> #include <sstream> using namespace std; int main(){ string str; stack<string> s; getline(cin,str); stringstream ss; ss<<str;//一行全部进去 while(ss>>str)//一个一个单词输出 s.push(str); while(!s.empty()){ cout<<s.top(); s.pop(); if(s.size()!=0) cout<<" "; } return 0; }
这里再介绍一下stringstream(字符串流)用法
- 字符串转数字
方法1:
string s="1234"; int i; stringstream ss; ss<<s; ss>>i; cout<<i;
方法2:
string s="1234"; int i=stoi(s); cout<<i;
- 数字转字符串
方法1:
int a=1234; string out; stringstream ss; ss<<a; ss>>out; cout<<out<<endl;
方法2:(c++ 11)
int a=1234; cout<<to_string(a)<<endl;
4、STL——queue
概念:队列(先进先出)
- 构造
queue<int> q;
-
push、back
q.push(5); q.push(6); cout<<q.front()<<endl;//5 q.pop(); cout<<q.front()<<endl;//6 cout<<q.size()<<endl;
5、STL——map(unordered_map pair)
概念:映射(map为树状表,unorderedmap为哈希表)
特点:map 会自动将所有的键值对按照键从小到大排序
- map 有序的,树状结构(底层)
map<string, int> m; // 定义一个空的map m,键是string类型的,值是int类型的 m["hello"] = 2; // 将key为"hello", value为2的键值对(key-value)存入map中 cout << m["hello"] << endl; // 访问map中key为"hello"的value, 如果key不存在,则返回0 cout << m["world"] << endl; m["world"] = 3; // 将"world"键对应的值修改为3 m[","] = 1; // 设立一组键值对,键为"," 值为1 // 用迭代器器遍历,输出map中所有的元素,键用it->first获取,值用it->second获取 for (auto it = m.begin(); it != m.end(); it++) { cout << it->first << " " << it->second << endl; } //利用C++ 11新特性 for (auto tmp:m){ cout<<tmp.first<<" "<<tmp.second<<endl; } // 访问map的第一个元素,输出它的键和值 cout << m.begin()->first << " " << m.begin()->second << endl; // 访问map的最后一个元素,输出它的键和值 cout << m.rbegin()->first << " " << m.rbegin()->second << endl; // 输出map的元素个数 cout << m.size() << endl;
- unordered_map //无序的,哈希结构(底层)
用法同map
- pair的用法(map转成vector进行排序)
bool cmp(pair<int,int> a,pair<int,int> b){ return a.first>b.first; } int main(){ unordered_map<int,int> m; m[6]=3; m[5]=8; m[4]=9; vector<pair<int,int>> v(m.begin(),m.end()); sort(v.begin(),v.end(),cmp); for(auto tmp:v){ cout<<tmp.first<<" "<<tmp.second<<endl; } return 0; }
9、set(unordered_set)
概念:集合
特点:一个set 里面的各元素是各不相同的,而且set 会按照元素进行从小到大排序
- set 树状结构,有序
set<int> s; // 定义一个空集合s s.insert(1); // 向集合s里面插入一个1 cout << *(s.begin()) << endl; // 输出集合s的第一个元素 (前面的星号表示要对指针取值) for (int i = 0; i < 6; i++) { s.insert(i); // 向集合s里面插入i } for (auto it = s.begin(); it != s.end(); it++) { // 用迭代器遍历集合s里面的每一个元素 cout<<*it<<" "; } for(auto tmp:s) cout<<tmp<<" "; cout << endl << (s.find(2) != s.end()) << endl; // s.find()用于查找集合s中的值,如果结果等于s.end()表示未找到(因为s.end()表示s的最后一个元素的下一个元素所在的位置) // s.find(2)!=s.end()表示能找到这个元素,因为能找到2,所以为真(1) cout << (s.find(10) != s.end()) << endl;//找不到10,为假(0) s.erase(1); // 删除集合s中的1这个元素 cout << (s.find(1) != s.end()) << endl;
- unordered_set 哈希结构,无序,快
用法同set
10、STL——deque
集合
概念:双端队列
deque<int> d; // 4 9 1 2 d.push_back(1); d.push_back(2); d.push_front(9); d.push_front(4); d.pop_back(); d.pop_front(); for(auto tmp:d) cout<<tmp<<endl; for(auto it=d.begin();it!=d.end();it++) cout<<*it<<endl;
- 排序
sort(d.begin(),d.end(),greater<int>());
11、STL——list
概念:双向链表
list<int> li; li.push_back(6); li.push_front(5); li.emplace_front(9); li.emplace_back(10); li.insert(++li.begin(),2); for(auto tmp:li) cout<<tmp<<endl; for(auto it=li.begin();it!=li.end();it++) cout<<*it<<endl;
参考:https://www.cnblogs.com/littlepage/p/12113748.html