c++的STL基本用法。
C++ STL(Standard Template Library,即标准模板库)中最基本以及最常用的类或容器如下:
- string
- vector
- set
- list
- map
STL的最主要的两个特点:数据结构和算法的分离,非面向对象本质。访问对象是通过象指针一样的迭代器实现的;容器是象链表,矢量之类的数据结构,并按模板方式提供;算法是函数模板,用于操作容器中的数据。由于STL以模板为基础,所以能用于任何数据类型和结构。
1.string( include <string>
)
在c语言中,想要表示一个字符串有两种方法:
数组和指针,数组I/O繁琐,指针对于不熟练的人来说,会出现各式各样的错误,而string可以解决以上两点问题。
-
string的初始化
-
string的操作
-
string的IO操作 :
a. getline来获取一整行内容:
在上一条的操作中,尤其应注意getline(),如果同一行内有用空格分隔开的信息,就不能用cin输入了,cin将会将空格分开的看作两个部分,可以用getline()输入。
b. 合并字符串时,’+‘号的运用
当把string对象和字符面值及字符串面值混在一条语句中使用时,必须确保+的两侧的运算对象至少有一个是string
string s1 = s2 + ", "; //正确
string s3 = "s " + ", "; //错误
string s4 = “hello” + ", " + s1; //错误
string s5 = s1 + "hello " + ", "; //改一下顺序,s1放前头,正确了,注意理解=号右边的运算顺序 -
处理string中的字符(访问字符串中每个字符)
方法一(类似数组):
for (int i = 0; i < s3.size(); i++)
{
cout << s3[i] << endl;
s3[i] = 's';
}
方法二(迭代器):
for (string::iterator it = str.begin(); it != str.end(); it++)
{
cout << *it << endl;
}
- string中的其他函数
string s;
s.find( string line );//查找字符串line在当前串中的位置
s.rfind( string line , int pos );//从pos开始从后向前查找字符串line在当前串中的位置
s.erase( int a , int b );//删除s串从a到b位置的内容
2.vector(include )
- 初始化:vector<类型> 名字
如果vector的元素类型是int,默认初始化为0;如果vector元素类型为string,则默认初始化为空字符串。
vector<int> v1;
vector<string> v3;
vector<vector<int> >; //注意空格。这里相当于二维数组int a[n][n];
vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号
vector<string> v6 = { "hi","my","name","is","lee" };
vector<int> v7(5, -1); //初始化为-1,-1,-1,-1,-1。第一个参数是数目,第二个参数是要初始化的值
vector<string> v8(3, "hi");
vector<int> v9(10); //默认初始化为0
- 基本操作
vector<int> v;
vector<int> v1;
vector<int> v2;
v.empty( ); //如果v中不含任何元素,返回真,否则返回假
v.size( ); //返回v中元素个数
v.push_back(t); 向v的尾端加入一个值为t的元素
v.pop_back(t); 删除v的尾端的元素
v[ n ]; //返回v中第n个位置上元素的引用
v1==v2; //当且仅当v1和v2元素数量相同且对应位置的元素值都相同时为真
v.erase( );//删除一个或多个元素
v.clear( );//删除所有元素
注意:只能对已存在的元素进行赋值或者修改操作,如果是要加入新元素,务必使用push_back。push_back的作用有两个:告诉编译器为新元素开辟空间、将新元素存入新空间里。
- 遍历vector的元素
方法一(类似数组):
for (int i = 0; i < v1.size(); i++) cout << v1[i] << endl;
方法二(迭代器):
正向迭代:
for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++)
cout << *iter << endl;
反向迭代:
for (vector<string>::reverse_iterator iter = v6.rbegin(); iter != v6.rend(); iter++)
cout << *iter << endl;
3.set(include )
set跟vector差不多,它跟vector的唯一区别就是,set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序(按字典序排序),而且,如果你添加的元素set里面本来就存在,那么这次添加操作就不执行.
set<int> s1{9,8,1,2,3,4,5,5,5,6,7,7 };
for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it<<" ";
}
//运行结果:1 2 3 4 5 6 7 8 9
4.list(include )
list即数据结构里所学的双向链表,优点是插入和删除元素都比较快捷,缺点是不能随机访问元素。有了list容器,我们就不用重复造轮子了,直接用即可。
- 初始化
list<int> l1{ 1,2,3,4,5,5,6,7,7 };
list<double> l2;
list<char> l3(10);
list<int> l4(5, 10); //将元素都初始化为10,即此时list为10,10,10,10,10。5
5.map(include
-
初始化
map<类型, 类型> mapStudent;
-
插入元素
//1.用insert函數插入pair
mapStudent.insert(pair<string, string>("r000", "student_zero"));
//2.用"array"方式插入
mapStudent["r123"] = "student_first";
mapStudent["r456"] = "student_second";
- 查找元素
1.用count判断
map<string, int> m1;
if (m1.count("123"))
{
cout << "123 is in m1!" << endl;
}
else
{
cout << "123 do not exist!" << endl;
}
2.迭代器
for (map<string, int>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << it->first<<" "<<it->second << endl; //注意用法,不是用*it来访问了。first表示的是key,second存的是value
}
- 删除元素
//用关键字删除
m1.erase("Curry");//如果刪除了會返回1,否則返回0
//迭代器删除
iter = m1.find("r123"); m1.erase(iter);
//清空map方法一(用迭代器)
m1.erase(m1.begin(), m1.end());
//清空map方法二(用clear函数)
m1.clear();