STL
标准模板库(Standard Template Library),是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。
这个库包括3种类型的通用项:容器、迭代器和算法。
有了STL,程序员就不必编写自己的类和函数,能够利用预先打包好的通用工具来解决先用的问题。
下面简单介绍几种最常用的STL工具,string、map、set、vector、iterator。以后有时间补充一下list、queue、stack等。
参考文献:C++ STL快速入门
string
头文件
#include <string>
初始化字符串
string s1;//初始化字符串,空字符串
string s2 = s1; //拷贝初始化,深拷贝字符串
string s3 = "ABCD"; //直接初始化,s3存了字符串
string操作
string的IO操作
使用cin读入字符串时,遇到空白就停止读取。
" Hello World"
cin>>s1; //Hello
用getline可以获取一整行内容。
string str;
getline(cin, str);
cout << str << endl;
vector
可以把向量vector理解为动态的数组。
头文件
#include <vector>
初始化
//T是某种类型
vector<T> v1;
vector<T> v2=v1;
vector<T> v3={a,b,c...};
如何向vector添加元素?
使用push_back加入元素,并且这个元素是被加在数组尾部的。
for (int i = 0; i < 20; i++)
{
v1.push_back(i);
}
vector基本操作:
常用增删操作:
介绍完容器的用法,可以开始引入迭代器了
迭代器
迭代器(iterator)是一个对象,用于引用储存在容器中的元素。因此,它是一个通用指针。
迭代器是一种访问元素的方法,下面介绍迭代器的声明:
容器类型::iterator 容器名
vector<int>::iterator iter;
迭代操作
以vector向量为实例:用迭代器遍历输出容器中的元素
vector<T>::iterator iter;
for(iter=v1.begin();iter!=v1.end();iter++)
{
cout<<*iter<<endl;
}
另外,在关系容器中(比如map),初始化iter为m.begin(),这个时候如果输出*iter则会报错。一般用->符号来访问关联容器元素。
以下是迭代器的基本运算:
set
集合(set)是按特定顺序存储唯一元素的容器。
set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序,而且,如果你添加的元素set里面本来就存在,那么这次添加操作就不执行。
set支持大部分的map的操作,但是set不支持下标的操作,而且没有定义mapped_type类型。
头文件
#include <set>
初始化
set<T> s;
set<T> s(s1);
set<T> s(b, e);//b和e分别为迭代器的开始和结束的标记
基本操作
- insert(key_value); 将key_value插入到set中 ,返回值是pair<set::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
- inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.
- erase(iterator) ,删除定位器iterator指向的值
- erase(first,second),删除定位器first和second之间的值
- erase(key_value),删除键值key_value的
- find() ,返回给定值值得定位器,如果没找到则返回end()。
- count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
set中数据只能通过insert()函数进行插入(有序且具备唯一性)。
set<int> s;
s.insert(1);//插入一个1
begin() ,返回set容器的第一个元素
end() ,返回set容器的最后一个元素
clear() ,删除set容器中的所有的元素
empty() ,判断set容器是否为空
max_size() ,返回set容器可能包含的元素最大个数
size() ,返回当前set容器中的元素个数
rbegin ,返回的值和end()相同
rend() ,返回的值和rbegin()相同
map
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。map运用了哈希表地址映射(Mapped Value)的思想,也就是key-value(键值对)的思想,来实现的。
- 对于迭代器来说,可以修改实值,而不能修改key。
- 容器中不存在同时拥有相同 Key 值的两个元素;
- 关联容器中的元素的参考地址指的是其 Key 值,而不是他们在容器中的绝对地址;
头文件
#include <map>
初始化构造方式
//=========================
// map 的多种构造函数
//=========================
// 1. 直接定义,<键,值>
map<char,int> mymap;
mymap['a'] = 10;
mymap['b'] = 60;
mymap['c'] = 30;
mymap['d'] = 90;
mymap['e'] = 50;
// 2. 复制
map<char, int> second(mymap);
// 3. 通过迭代器
map<char, int> third(mymap.begin(),mymap.end());
// 4. 重新定义 Compare 对象,该对象内部对运算符 () 进行重载
map<char, int, classcomp> fourth;
// 5. 通过函数指针
bool(*fn_pt)(char, char) = fncomp;
map<char, int, bool(*)(char, char)> fifth(fn_pt);
基本操作
//=========================
// 1. 输出所有 Pair 元素
//=========================
// 迭代器遍历 map
for (it; it != mymap.end(); it++)
{
// map的迭代器,可以用 first 访问std::pair的第一个成员(Type1),second 访问第二个成员 (Type2)
cout<<it->first<<":"<<it->second<<endl;
}
cout<<"================================="<<endl;
//=========================
// 2. 修改映射值
//=========================
second.clear();
second['a']=1002;
second['b']=10023;
while (!second.empty())
{
cout << second.begin()->first << " => ";
cout << second.begin()->second << endl;
second.erase(second.begin());
}
cout<<"================================="<<endl;
//=========================
// 3. 插入
//=========================
mymap.insert(pair<char,int>('f',100) );
mymap.insert(pair<char,int>('g',200) );
cout<<"f => " <<mymap.find('f')->second<<endl;
cout<<"g => " <<mymap.find('g')->second<<endl;
cout<<"================================="<<endl;
//=========================
// 4. Compare 参数的使用
//=========================
key_comp = mymap.key_comp();
cout << "mymap contains:\n";
// 迭代器反向遍历的起始位置
char highest = mymap.rbegin()->first; // key value of last element
it = mymap.begin();
do {
cout << (*it).first << " => " << (*it).second << endl;
} while ( key_comp((*it++).first, highest) );
cout << endl;
return 0;
如果想看看某个存不存在某个key,可以用count来判断
if (m1.count("Lee"))
{
cout << "Lee is in m1!" << endl;
}
else
{
cout << "Lee do not exist!" << endl;
}
用erase完成删除操作
m1.erase("Curry");//通过关键字来删除
查找某个键值对
// 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器
// 根据map的类型,返回的迭代器为 iterator 或者 const_iterator
if(map.find(a)!=map.end())
{...}
//以上表示找到了a,执行代码块