|
对比于C来讲,C++中的STL确实让人非常舒服,因为大家都可以统一起来,这样无论是写自己的代码还是读别人的代码都会非常轻松。今天小小对之前学习的内容总结一波。
那什么是STL呢。C++ STL(标准模板库)是一套功能强大的C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。 容器是用来管理某一类对象的集合。 C++ 提供了各种不同类型的容器,比如deque、list、vector、map 等。
balabala的说了一堆,其实STL对我来讲感觉就是一个“包”,就是我们不用自己写数组,自己写队列这些,调用别人规定好的模板就OK,因为STL去除了面向对象性,通用性很高,随便用,而且这样大家的代码一致性高,一起写项目的时候就会很舒服。
1. string
string 是封装好的字符串容器。并不与char等同,如需使用char,需要进行转换成c_str()。
char 只能进行单个操作,无法做到像 string 直接操作这么简洁。
输入如下
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
string s1;
s1 = &#34;hello&#34;;
string s2;
char s[1024];
// C++提供的输入流cin其实输入速度比scanf慢很多,但scanf并不能用来往string中做输入
scanf(&#34;%s&#34;,s); // 数组名是根地址
s2 = s;
// 字符串的加法运算
s2 += &#34;abc&#34;;
s2.append(&#34;456&#34;);
// 删除操作,利用迭代器
string::iterator it = s2.begin();
// 删除s2[6]-s[8]
s2.erase(it+6,it+9);
s2.clear() // 全清
return 0;
}
查找操作
可以利用find函数找到string里面第一个要找到的元素(char或者串),并返回在字符串中第一次出现的下标,找不到就返回-1.
string s1;
s1 = &#34;haokai-su&#34;;
int n = s1.find(&#34;ao&#34;);
int m = s1.find(&#39;-&#39;);
n = s1.find(&#34;ao&#34;,2); // 从第二个元素开始找。
string 与char*的互相转换
其实 string 的内部就是一个 char 字符数组。 private final char value[];这是string内部用来储值的结构。
string s_string;
char s_char[1000];
scanf(&#34;%d&#34;,s_char);
s_string = s_char;
// printf 输出char*时用c_str处理
printf(s_string.c_str());
cout << endl;
printf(&#34;%s&#34;,s_char);
cout << endl;
string 与 数字的互相转换
int n = 123456.123456;
string s = to_string(n);
string a = &#34;123456&#34;;
int n = a.stoi(a);
2. 迭代器 iterator
目前在我看来,迭代器就是给我提供了容器中各个元素的指针,以供我读取和改变。可用于遍历操作。
《ACM程序设计》:迭代器就是把所有有关的东西抽象出来,无论是数组的下标,指针,for里面,list里面,vector里面,都可以变成iterator.
vector<int> v;
for(int i = 0; i < 10; i++)
{
v.push_back(i);
}
// .begin() 是第一个元素的指针 .end()是最后一个元素的下一个的指针
for(vector<int>::iterator it = v.begin(); it != v.end; ++it)
{
cout << *it << endl;
}
3. sort and reverse
sort 可以实现升序排序(但其实也可以实现降序排序),而 reverse 可以实现反向排序。
语法
vector<int> a(10);
sort(a.begin(),a.end(),less<int>()); // 升序
sort(a.begin(),a.end(),greater<int>()); // 降序
reverse(a.begin(),a.end());
4. pair
将两个不同类型的数据合并成一个大数据,例如 map 中的 key 和 value 是合起来保存的。另一个应用是当一个函数想要返回2个数据的时候,可以选择pair的结构体。
int main()
{
pair<string,string> a; // 创建一个空的a,两个元素类型都是string
// 可以用 first 和 second 来访问第一,二个元素
a.first = &#34; SuDaxia &#34;;
a.second = &#34; DaXiasu &#34;;
/*
常见于
queue<pair<int,int>> city;
*/
return 0;
}
5. map (关联容器)
map 关联容器包含两个部分 key: value
其中,键值 key 既不能重复,也不能被修改(const)。
int main()
{
// 初始化
map<string,int> mymap = {{&#34;AGE&#34;,15}};
cout << mymap[&#34;AGE&#34;] << endl;
// 向 map 容器中添加新的键值对
mymap[&#34;添加新key&#34;] = 1;
// 修改 map 中已存键值对中,指定键值对应的值
mymap[&#34;AGE&#34;] = 18;
// 删除元素
mymap.erase(&#34;AGE&#34;); // 通过 key 索引删除
mymap.erase(mymap.begin()+1); // 通过迭代器 iterator 删除
// for(map<string,int>::iterator iter = mymap.begin(); iter != mymap.end(); iter++)
for(auto iter = mymap.begin(); iter != mymap.end(); iter++)
{
cout << iter->first << &#34; &#34; << iter->second << endl;
}
return 0;
}
6. set (关联容器)
关联容器和顺序容器(诸如vector,queue,list,string)有着根本的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。
set是STL中的常见容器,set中不允许有重复的元素,并且set中的元素是排好序的.
set<int> a; //set 的声明 默认是升序
set<int,greater<int>> a; // 降序排列
// set 可以和 vector 进行互换
vector<int> v;
v = {1,2,3,4};
// vector 转 set
set<int> st(v.begin(),v.end());
v.assign(st.begin(),st.end());
7.设置输出精度
double a = 12.123;
cout << &#34;1: &#34; << a << endl;
cout.setf(ios::fixed); //使用固定符号生成浮点类型
cout.precision(2); //设置小数点精度为两位
cout << &#34;2: &#34; << a << endl;
cout.unsetf(ios::fixed); //取消固定
cout.precision(6); //恢复默认精度6
cout << &#34;3: &#34; << a << endl;
cout.precision(2); //未使用cout.setf(ios::fixed)固定小数点
//此时作用是设置总精度为两位
cout << &#34;4: &#34; << a << endl; |
|