c++ 常用STL笔记

来源:互联网 发布:java乘法函数 编辑:程序博客网 时间:2024/06/06 13:13
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();