C++STL整理
C++ STL中最基本以及最常用的类或容器
string、vector、set、list、map
string
处理string中的字符
for(int i=0;i<s3.size();i++)
{
cout<<s3[i]<<endl;
s3[i]='s';
}
迭代器iterator,访问容器元素
iter
返回迭代器iter所指元素的引用
iter->mem
解引用iter并获取该元素的名问men的成员,等价于(item).mem
++iter
令iter指示容器中的下一个元素
--iter
令iter指示容器中的上一个元素
iter1==iter2;iter1!=iter2
判断两个迭代器是否相等(不相等),如果两个迭代器指示的是同一个元素或者它们是同一个容器的尾后迭代器,则相等;反之,不相等
string str("hi sysu");
for (string::iterator it = str.begin(); it != str.end(); it++)
{
cout << *it << endl;
}
string 别的函数
string sq("heoolo sdaa ss");
cout << s.find("aa", 0) << endl; //返回的是子串位置。第二个参数是查找的起始位置,如果找不到,就返回string::npos
if (s.find("aa1", 0) == string::npos)
{
cout << "找不到该子串!" << endl;
}
vector
如果vector的元素类型是int,默认初始化为0;如果vector的元素类型为string,则默认初始化为空字符串。
使用push_back加入元素,并且这个元素是被加在数组尾部。
for (int i = 0; i < 20; i++)
{
v1.push_back(i);
}
vector其他的操作
v.empty()
v.size()
v.push_back(t)
v[n],返回v中第n个位置上的元素的引用
v1={a,b,c...}
访问和操作vector中的每个元素
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << endl;
v1[i] = 100;
cout << v1[i] << endl;
}
只能对已存在的元素进行赋值或者修改操作,如果要是新加入元素,务必使用push_back.push_back的作用,告诉编译器为新元素开辟空间。将新元素存入新空间里。
使用迭代器来访问元素
vector<string> v6 = { "hi","my","name","is","lee" };
for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++)
{
cout << *iter << endl;
//下面两种方法都行
cout << (*iter).empty() << endl;
cout << iter->empty() << endl;
}
List
list就是链表,在C语言中我们想使用链表都是自己去实现的,实现起来倒不难,但是如果有现成的高效的链表可以使用的话,我们就不需要重复造轮子了。STL就提供了list容器给我们。
list是一个双向链表,而单链表对应的容器则是foward_list。
list即双向链表的优点是插入和删除元素都比较快捷,缺点是不能随机访问元素。
初始化方式就大同小异了,跟vector基本一样。要想用list先加个头文件list。
#include <list>
#include <iostream>
#include <list>
#include <string>
using namespace std;
template <typename T>
void showlist(list<T> v)
{
for (list<T>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it;
}
cout << endl;
}
int main()
{
list<int> l1{ 1,2,3,4,5,5,6,7,7 };
showlist(l1);
list<double> l2;
list<char> l3(10);
list<int> l4(5, 10); //将元素都初始化为10
showlist(l4);
system("pause");
return 0;
}
map
map运用了哈希表地址映射的思想,也就是key-value的思想,来实现的。
首先给出map最好用也最最常用的用法例子,就是用字符串作为key去查询操作对应的value。
要使用map得先加个头文件map。
#include <map>
#include <iostream>
#include <map>
#include <string>
using namespace std;
void showmap(map<string, int> v)
{
for (map<string, int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << it->first << " " << it->second << endl; //注意用法,不是用*it来访问了。first表示的是key,second存的是value
}
cout << endl;
}
int main()
{
map<string, int> m1; //<>里的第一个参数表示key的类型,第二个参数表示value的类型
m1["Kobe"] = 100;
m1["James"] = 99;
m1["Curry"] = 98;
string s("Jordan");
m1[s] = 90;
cout << m1["Kobe"] << endl;
cout << m1["Jordan"] << endl;
cout << m1["Durant"] << endl; //不存在这个key,就显示0
m1.erase("Curry");//通过关键字来删除
showmap(m1);
m1.insert(pair<string, int>("Harris", 89)); //也可以通过insert函数来实现增加元素
showmap(m1);
m1.clear(); //清空全部
system("pause");
return 0;
}
[图片上传中...(image-fb90d6-1554208576435-0)]
如果想看看某个存不存在某个key,可以用count来判断
if (m1.count("Lee"))
{
cout << "Lee is in m1!" << endl;
}
else
{
cout << "Lee do not exist!" << endl;
}
用迭代器来访问元素
for (map<string, int>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << it->first<<" "<<it->second << endl; //注意用法,不是用*it来访问了。first表示的是key,second存的是value
}