STL在ACM中的应用
STL 提供三种类型的组件:容器、迭代器和算法,它们都支持泛型程序设计标准。在ACM中充分利用STL可以大大的简化程序,提高解题效率。
1、容器主要有两类:顺序容器和关联容器。顺序容器(vector/list/deque/string)等是一系列元素的有序集合。关联容器(set/multiset/map/multimap)包含查找元素的键值。
2、迭代器的作用是遍历容器。
3、STL算法库包含四类算法:排序算法,不可变算法,变序算法和数值算法。
一、Vector
vector基本操作
vector<int> v;
v.begin(); //容器的起始位置
v.end(); //容器最后一个位置后的位置
v.front();v.back(); //返回第一个元素(最后一个元素,但不判断是否存在
v.empty(); //返回是否容器为空
v.clear(); //清空容器
v.erase(m); //删除m位置的数据,并返回下一个数据的地址(m是迭代器)
v.erase(m,n); //删除m到n之间的数据,并返回下一个数据的地址
v2.assign(8,1); // 重新给vec2赋值,8个成员的初始值都为1
v.push_back(element); //压入一个元素到末端
v.pop_back(); //弹出最后一个元素
v.reserve(100);v.resize(101); //resize已经创建空间如果再v.push_back();空间就会到101,而reserve只是预留空间并没有真正创建,v.push_back();只是在第1位
v.size();v.capacity(); //size表示的是已经创建的空间大小也可以表示元素个数可用v[]的形式直接访问,capacity容器容量,是预留空间并没有实际创建
swap(a,b); //交换两个元素的位置如:swap(v[0],v[1]);
vector<int> v(10); //创建一个前十个元素为int的容器
vector<string> v(10,string("I")); //使容器的前10个元素都为string型,并且都初始化为I
vector<string> v1(v2); //对于已经存在的v2创建一个v1副本
v.insert(place,element);
v.insert(place,n,element); //在place(迭代器)位插入n个元素
//注:对vector元素的访问可以用类似c语言的v[],但是最好用v.at(),它会检查是否越界更安全
v[0]; // A
v.at[0]; // B 这样越界的时候比较安全
// use <algorithm> std::find to locate pos of 5 in vi.
// 删值为5的元素
iter = find(vi.begin(), vi.end(), 5);
if (iter != vi.end()) {
pln("erase 5");
vi.erase(iter);
}
vector遍历
使用迭代器
vector<int> ::iterator it;
for(it = v.begin(); it!=v.end(); it++)
{
cout<<(*it)<<endl;
}
二、String
string的基本操作
//添加
str.push_back('a'); //向str最后添加字符a,注意只能添加单个字符。
str.insert(2,"adf"); //插入函数,向str的第二个字符后插入adf
str+=“adf” //加个adf字符串
str.sppend("adf");//在最后加个字符串;
str.sppend(str1,1,3);//将str1的1-3位的字符加到str后面;
str.append(“abcd”,5);str.append(5,'x');//同上,只是是在尾部插入
//比较compare函数比较
string str(“abcd”);
str.compare(“abcd”); //str和“abcd”比较,相同返回0
str.compare(“dcba”); //返回一个小于0的值
str.compare(“ab”); //返回大于0的值
str.compare(s); //相等,返回0
str.compare(0,2,str,2,2); //用str从0开始的两位和str从2开始的两位比较,返回小于0的数
str.compare(1,2,”bcx”,2); //用”bc”和”bc”比较,返回0
//以上都是按照字典顺序比较
str1.find(str2)比较包含关系,如果str2不是str1的子串返回值为string::npos
//删除
//清空
str.clear();str.erase();
//从指定位置删除
str.erase(13);//从13位开始往后全删除
str.erase(7,5);//从7位开始往后删5个
//还有个替换函数
str.replace(1,2,”asdf”);//将1位开始的2个替换成asdf
提取子串的函数是:substr(),形式如下:
s.substr();//返回s的全部内容
s.substr(11);//从索引11往后的子串
s.substr(5,6);//从索引5开始6个字符
三、Set
set的基本操作
set<int> s;
s.insert(element);//插入元素
//遍历整个几何(不重复的有序序列)
set<int>:: iterator it;
for(it = s.begin(); it!=s.end(); it++){
cout<<(*it)<<endl;
}
s.size();//返回元素个数
s.find(ele);//返回元素的下标,没找到的话返回s.end();
//获得两个set的并
set<int> s1;
set<int> s2;
set<int> s3;//存结果
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3,s3.begin()));
//输出也可以用下面的形式
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下
s3.clear();
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3.s3.begin()));
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//删除键值为2的元素
s.erase(2);
//获得两个set的差
s3.clear();
set_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3,s3.begin()));
cout<<"Difference:";
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B
eg3.clear();
set_symmetric_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3,s3.begin()));
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
三、Map
map的基本操作
#include<map>
map<int, string> mym;
//三种插入方法
mym.insert(pair<int,string>(120,"haha"));
mym.insert(map<int,string>::value_type(312,"gaga"));
mym[120] = "haha";
//find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
map<int ,string >::iterator l_it;
l_it=maplive.find(112);//返回的是一个指针
if(l_it==maplive.end())
cout<<"we do not find112"<<endl;
else
cout<<"wo find112"<<endl;
//也可以用这种方式来查找
map<int ,string> m;
m[1] = "haa";
m[44] = "xixi";
if(m[12]=="") puts("NO");
//删除一个元素
map<int,string> m;
map<int,string>::iterator it;
it = m.find(112);
if(it == m.end()){ exit;}
else m.erase(it);
//类似的也可以通过赋值为空来将一个元素删除
//Map中的swap不是一个容器中的元素交换,而是两个容器交换
begin() //返回指向map头部的迭代器
clear()// 删除所有元素
count()// 返回指定元素出现的次数
empty() //如果map为空则返回true
end() //返回指向map末尾的迭代器
equal_range()// 返回特殊条目的迭代器对
erase() //删除一个元素
find() //查找一个元素
insert() //插入元素
lower_bound() //返回键值>=给定元素的第一个位置
max_size() //返回可以容纳的最大元素个数
rbegin() //返回一个指向map尾部的逆向迭代器
rend() //返回一个指向map头部的逆向迭代器
size() //返回map中元素的个数
swap()// 交换两个map
upper_bound()// 返回键值>给定元素的第一个位置
value_comp() //返回比较元素value的函数
五、Queue
queue的基本操作
#include<queue>
queue<int> q1;
q.push(x);//将元素插入到队列末尾
q.pop();//弹出队列的第一个元素(队首),并不会返回元素的值
q.front();//访问队首的元素
q.back();//访问队尾元素
q.size();//返回队列中元素的个数
六、Stack
stack的基本操作
#include<stack>
stack<int> s;
s.push();//压栈
s.pop();//出栈
s.top();//获取栈顶元素
s.empty();
s.size();
s.end();
s.begin();
STL 提供三种类型的组件:容器、迭代器和算法,它们都支持泛型程序设计标准。在ACM中充分利用STL可以大大的简化程序,提高解题效率。
1、容器主要有两类:顺序容器和关联容器。顺序容器(vector/list/deque/string)等是一系列元素的有序集合。关联容器(set/multiset/map/multimap)包含查找元素的键值。
2、迭代器的作用是遍历容器。
3、STL算法库包含四类算法:排序算法,不可变算法,变序算法和数值算法。
一、Vector
vector基本操作
vector<int> v;
v.begin(); //容器的起始位置
v.end(); //容器最后一个位置后的位置
v.front();v.back(); //返回第一个元素(最后一个元素,但不判断是否存在
v.empty(); //返回是否容器为空
v.clear(); //清空容器
v.erase(m); //删除m位置的数据,并返回下一个数据的地址(m是迭代器)
v.erase(m,n); //删除m到n之间的数据,并返回下一个数据的地址
v2.assign(8,1); // 重新给vec2赋值,8个成员的初始值都为1
v.push_back(element); //压入一个元素到末端
v.pop_back(); //弹出最后一个元素
v.reserve(100);v.resize(101); //resize已经创建空间如果再v.push_back();空间就会到101,而reserve只是预留空间并没有真正创建,v.push_back();只是在第1位
v.size();v.capacity(); //size表示的是已经创建的空间大小也可以表示元素个数可用v[]的形式直接访问,capacity容器容量,是预留空间并没有实际创建
swap(a,b); //交换两个元素的位置如:swap(v[0],v[1]);
vector<int> v(10); //创建一个前十个元素为int的容器
vector<string> v(10,string("I")); //使容器的前10个元素都为string型,并且都初始化为I
vector<string> v1(v2); //对于已经存在的v2创建一个v1副本
v.insert(place,element);
v.insert(place,n,element); //在place(迭代器)位插入n个元素
//注:对vector元素的访问可以用类似c语言的v[],但是最好用v.at(),它会检查是否越界更安全
v[0]; // A
v.at[0]; // B 这样越界的时候比较安全
// use <algorithm> std::find to locate pos of 5 in vi.
// 删值为5的元素
iter = find(vi.begin(), vi.end(), 5);
if (iter != vi.end()) {
pln("erase 5");
vi.erase(iter);
}
vector遍历
使用迭代器
vector<int> ::iterator it;
for(it = v.begin(); it!=v.end(); it++)
{
cout<<(*it)<<endl;
}
二、String
string的基本操作
//添加
str.push_back('a'); //向str最后添加字符a,注意只能添加单个字符。
str.insert(2,"adf"); //插入函数,向str的第二个字符后插入adf
str+=“adf” //加个adf字符串
str.sppend("adf");//在最后加个字符串;
str.sppend(str1,1,3);//将str1的1-3位的字符加到str后面;
str.append(“abcd”,5);str.append(5,'x');//同上,只是是在尾部插入
//比较compare函数比较
string str(“abcd”);
str.compare(“abcd”); //str和“abcd”比较,相同返回0
str.compare(“dcba”); //返回一个小于0的值
str.compare(“ab”); //返回大于0的值
str.compare(s); //相等,返回0
str.compare(0,2,str,2,2); //用str从0开始的两位和str从2开始的两位比较,返回小于0的数
str.compare(1,2,”bcx”,2); //用”bc”和”bc”比较,返回0
//以上都是按照字典顺序比较
str1.find(str2)比较包含关系,如果str2不是str1的子串返回值为string::npos
//删除
//清空
str.clear();str.erase();
//从指定位置删除
str.erase(13);//从13位开始往后全删除
str.erase(7,5);//从7位开始往后删5个
//还有个替换函数
str.replace(1,2,”asdf”);//将1位开始的2个替换成asdf
提取子串的函数是:substr(),形式如下:
s.substr();//返回s的全部内容
s.substr(11);//从索引11往后的子串
s.substr(5,6);//从索引5开始6个字符
三、Set
set的基本操作
set<int> s;
s.insert(element);//插入元素
//遍历整个几何(不重复的有序序列)
set<int>:: iterator it;
for(it = s.begin(); it!=s.end(); it++){
cout<<(*it)<<endl;
}
s.size();//返回元素个数
s.find(ele);//返回元素的下标,没找到的话返回s.end();
//获得两个set的并
set<int> s1;
set<int> s2;
set<int> s3;//存结果
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3,s3.begin()));
//输出也可以用下面的形式
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下
s3.clear();
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3.s3.begin()));
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//删除键值为2的元素
s.erase(2);
//获得两个set的差
s3.clear();
set_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3,s3.begin()));
cout<<"Difference:";
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B
eg3.clear();
set_symmetric_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),insert_iterator<set<int> >(s3,s3.begin()));
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
三、Map
map的基本操作
#include<map>
map<int, string> mym;
//三种插入方法
mym.insert(pair<int,string>(120,"haha"));
mym.insert(map<int,string>::value_type(312,"gaga"));
mym[120] = "haha";
//find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
map<int ,string >::iterator l_it;
l_it=maplive.find(112);//返回的是一个指针
if(l_it==maplive.end())
cout<<"we do not find112"<<endl;
else
cout<<"wo find112"<<endl;
//也可以用这种方式来查找
map<int ,string> m;
m[1] = "haa";
m[44] = "xixi";
if(m[12]=="") puts("NO");
//删除一个元素
map<int,string> m;
map<int,string>::iterator it;
it = m.find(112);
if(it == m.end()){ exit;}
else m.erase(it);
//类似的也可以通过赋值为空来将一个元素删除
//Map中的swap不是一个容器中的元素交换,而是两个容器交换
begin() //返回指向map头部的迭代器
clear()// 删除所有元素
count()// 返回指定元素出现的次数
empty() //如果map为空则返回true
end() //返回指向map末尾的迭代器
equal_range()// 返回特殊条目的迭代器对
erase() //删除一个元素
find() //查找一个元素
insert() //插入元素
lower_bound() //返回键值>=给定元素的第一个位置
max_size() //返回可以容纳的最大元素个数
rbegin() //返回一个指向map尾部的逆向迭代器
rend() //返回一个指向map头部的逆向迭代器
size() //返回map中元素的个数
swap()// 交换两个map
upper_bound()// 返回键值>给定元素的第一个位置
value_comp() //返回比较元素value的函数
五、Queue
queue的基本操作
#include<queue>
queue<int> q1;
q.push(x);//将元素插入到队列末尾
q.pop();//弹出队列的第一个元素(队首),并不会返回元素的值
q.front();//访问队首的元素
q.back();//访问队尾元素
q.size();//返回队列中元素的个数
六、Stack
stack的基本操作
#include<stack>
stack<int> s;
s.push();//压栈
s.pop();//出栈
s.top();//获取栈顶元素
s.empty();
s.size();
s.end();
s.begin();