STL容器用法总结
2012-07-07 19:29
309 查看
看了c++的STL容器,对STL有了一定的理解,为了方便记忆和以后的复习,在此总结一下,作些比较。
这里只是STL初步用法总结,关于更深层次的,关于源代码方面和STL的很多算法等以后再研究
迭代器只能进行“++”或“- -”操作,不能进行+n或-n的操作,因为元素的位置并不是物理相连的
一、vector容器 (头文件:#include<vector>)
1.创建
vector<int> v;
vector<double> v(10,8.6) 定义了 v 向量容器,有10个元素,每个元素的值为8.6;//注意此处与数组相比,优势是可以不用遍历,直接将所需的元素赋同一初值8.6。
2.添加元素
v.push_back(2); 在容器尾部追加新元素2。
v.insert(v.begin()+2,8); 在第二个元素前面插入8,(注意:vector容器的元素统计和数组的下标一样都是从零开始)
括号里面(迭代器位置,需要插入的元素值) //不知道迭代器的孩子,问问百度...
3.删除元素
v.clear(); 清空容器
v.erase(v.begin()+2); 删除第2个元素(从0开始计数)
v.erase(v.begin()+2;v.begin()+5); 删除第2个元素到第5个之间
4.向量的大小
v.size(); 返回元素个数
v.empty(); f判断是否为空,非空 返回0,空 返回1
5.元素访问、遍历
用迭代器访问元素
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
用下标像数组那样
for(i=0;i<v.size();i++)
{
cout<<v[i]<<endl;
}
6.元素反向排列与排序 (头文件 #include<algorithm>)
反向排列:reverse(v.begin(),v.end());
排序:
sort(v.begin(),v.end()); 升序
sort(v.begin(),v.end(),cmp); 根据排序函数cmp排序
二、string (头文件#include<string>) 处理字符串
1.创建
string s; 创建了字符串对象s
2.赋值和添加
s=“hello”; 直接
char ss[10]=“hello”; s=ss; 利用字符数组
s=s+‘a’; s+=“hello”; 直接尾部追加
s.append("hello"); 采用append()方法尾部追加
s.insert(it+1,‘p’); 将‘p’插入到指定位置
3.删除
s=“ ”; 将空字符串赋给s,清空字符串
s.erase(it,it+4); 删除迭代器指定位置
4.访问元素
下标法和迭代器(同上vector容器)
5.字符串的长度
s.length() ; 返回字符串长度
s.empty() ; 判读是否为空
6.替换string中的字符
s.replace(3,3,"good") ; 从第3个开始,将连续的3个字符替换为good
7.搜索
s.find("abcd"); 如果能找到, 返回下标值(从0开始),找不到则返回string::npos(if(s.find("dds")==string::npos)表示没找到)
s.find('a'); 返回下标值(从0开始) 找不到则返回string::npos (找不到的i时t型返回的值是-1)
8.比较
s.compare("字符串"); 如果s比对方大返回1,相等返回0,比对方小返回-1(比较的方式和strcmp相同,先根据长度,再根据Ascll)
char ss[10]=“字符串”;s.compare(ss);如果s比对方大返回1,相等返回0,比对方小返回-1
9.作为vector的元素
vector<string> v;
三、set集合容器与multiset集合容器 (头文件 #include<set>)
特点:插入元素后,自动排序,默认从小到大
set与multiset的区别是set的元素可不能重复,multiset允许重复
1.添加元素
s.insert(8); 插入元素8
2.删除
s.erase(8);插入元素8
注意:如果是multiset,n=s.erase(8); 如果有多个8,将删除所有的8,并返回8的个数n
s.clear(); 清空
3.搜索
s.find(); 返回迭代器位置
it=s.find(6);
if(it!=s.end()) 说明找到
4.自定义比较函数
a.元素不是结构体
struct cmp
{
bool operator() (const int &a ,const int &b)
{
return a>b;
}
};
set<int,cmp>
s;
b.元素是结构体
struct info
{
string name;
double score;
bool operator < (const inof &a) const
{
return a.score<score;
}
};
set<info> s;
四、map映照容器与multimap (头文件 #include<map>)
特点:map的数据类型是由一个键值和一个映照数据组成,与set一样也是默认按从小到大的顺序排列,map与multimap的区别是键值能否重复
1.建立
map<string,folat> m;
m["jack"]=98.5;
map<int,char> m
m[1]='a';
2. 输出键值和映照数据
for(it=m.begin();it!=m.end();it++)
{
cout<<(*it).first<<(*it).second<<endl;
}
3.搜索
m.find(键值);
4.删除
multimap的删除也是一次性将所有重复的键值删完
m.clear() ; 清空
五、deque双端容器队列与queue队列容器 (头文件分别为 #include<deque> 和#include<queue>)
区别:deque在头部,尾部和中间都能插入和删除元素,queue只能在尾部插入,在头部删除
1.建立
deque<int> d(10,8) 创建具有十个值均为8的容器
2.添加元素
d.push_back(8); 从尾部插入
d.push_front(8); 从头部插入
d.insert(d.begin()+2,8);
3.元素数目
d.size();
4.删除元素
d.pop_back(); 从尾部删除
d.pop_front(); 从头部删除
d.erase("迭代器位置");
d.clear(); 清空
queue的使用方法
入队 p.push() 出队p. pop() 读取队首元素p.front()读取队尾元素p.back() 判断是否为空 p.empty() 元素数目 p.size()
六、list双向链表容器 (头文件 #include<list>)
1.创建
list<int> l(10); 创建具有十个元素的链表
2.添加(与deque相同)
l.push_back(); l.push_front(); l.insert(迭代器位置,元素);
3.删除
l.remove(2); 删除等于2的所有元素
l.pop_back(); l.pop_front();
l.erase(迭代器位置);
l.clear(); 清空链表
4.查找(队列没有查找功能) 需要在#include<algorithm>头文件下
it=find(l.begin(),l.end(),5); 在链表中查找
if(it!=l.end()) 找到
5.排序(队列没有排序功能)
l.sort();
6.剔除连续相同元素只保留一个 l.unique();
七、stack堆栈容器 (头文件#include<stack>)
特点是先进先出,添加与删除只能在栈顶进行
p.push() ; 入栈 p.pop(); 出栈 p.top(); 栈顶元素 p.empty(); 判断是否为空 p.size(); 判断元素数目
八、bitset位集合容器(先不写保留)
终于写完了。。好累呀
一劳永逸吧。。
这里只是STL初步用法总结,关于更深层次的,关于源代码方面和STL的很多算法等以后再研究
迭代器只能进行“++”或“- -”操作,不能进行+n或-n的操作,因为元素的位置并不是物理相连的
一、vector容器 (头文件:#include<vector>)
1.创建
vector<int> v;
vector<double> v(10,8.6) 定义了 v 向量容器,有10个元素,每个元素的值为8.6;//注意此处与数组相比,优势是可以不用遍历,直接将所需的元素赋同一初值8.6。
2.添加元素
v.push_back(2); 在容器尾部追加新元素2。
v.insert(v.begin()+2,8); 在第二个元素前面插入8,(注意:vector容器的元素统计和数组的下标一样都是从零开始)
括号里面(迭代器位置,需要插入的元素值) //不知道迭代器的孩子,问问百度...
3.删除元素
v.clear(); 清空容器
v.erase(v.begin()+2); 删除第2个元素(从0开始计数)
v.erase(v.begin()+2;v.begin()+5); 删除第2个元素到第5个之间
4.向量的大小
v.size(); 返回元素个数
v.empty(); f判断是否为空,非空 返回0,空 返回1
5.元素访问、遍历
用迭代器访问元素
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
用下标像数组那样
for(i=0;i<v.size();i++)
{
cout<<v[i]<<endl;
}
6.元素反向排列与排序 (头文件 #include<algorithm>)
反向排列:reverse(v.begin(),v.end());
排序:
sort(v.begin(),v.end()); 升序
sort(v.begin(),v.end(),cmp); 根据排序函数cmp排序
二、string (头文件#include<string>) 处理字符串
1.创建
string s; 创建了字符串对象s
2.赋值和添加
s=“hello”; 直接
char ss[10]=“hello”; s=ss; 利用字符数组
s=s+‘a’; s+=“hello”; 直接尾部追加
s.append("hello"); 采用append()方法尾部追加
s.insert(it+1,‘p’); 将‘p’插入到指定位置
3.删除
s=“ ”; 将空字符串赋给s,清空字符串
s.erase(it,it+4); 删除迭代器指定位置
4.访问元素
下标法和迭代器(同上vector容器)
5.字符串的长度
s.length() ; 返回字符串长度
s.empty() ; 判读是否为空
6.替换string中的字符
s.replace(3,3,"good") ; 从第3个开始,将连续的3个字符替换为good
7.搜索
s.find("abcd"); 如果能找到, 返回下标值(从0开始),找不到则返回string::npos(if(s.find("dds")==string::npos)表示没找到)
s.find('a'); 返回下标值(从0开始) 找不到则返回string::npos (找不到的i时t型返回的值是-1)
8.比较
s.compare("字符串"); 如果s比对方大返回1,相等返回0,比对方小返回-1(比较的方式和strcmp相同,先根据长度,再根据Ascll)
char ss[10]=“字符串”;s.compare(ss);如果s比对方大返回1,相等返回0,比对方小返回-1
9.作为vector的元素
vector<string> v;
三、set集合容器与multiset集合容器 (头文件 #include<set>)
特点:插入元素后,自动排序,默认从小到大
set与multiset的区别是set的元素可不能重复,multiset允许重复
1.添加元素
s.insert(8); 插入元素8
2.删除
s.erase(8);插入元素8
注意:如果是multiset,n=s.erase(8); 如果有多个8,将删除所有的8,并返回8的个数n
s.clear(); 清空
3.搜索
s.find(); 返回迭代器位置
it=s.find(6);
if(it!=s.end()) 说明找到
4.自定义比较函数
a.元素不是结构体
struct cmp
{
bool operator() (const int &a ,const int &b)
{
return a>b;
}
};
set<int,cmp>
s;
b.元素是结构体
struct info
{
string name;
double score;
bool operator < (const inof &a) const
{
return a.score<score;
}
};
set<info> s;
四、map映照容器与multimap (头文件 #include<map>)
特点:map的数据类型是由一个键值和一个映照数据组成,与set一样也是默认按从小到大的顺序排列,map与multimap的区别是键值能否重复
1.建立
map<string,folat> m;
m["jack"]=98.5;
map<int,char> m
m[1]='a';
2. 输出键值和映照数据
for(it=m.begin();it!=m.end();it++)
{
cout<<(*it).first<<(*it).second<<endl;
}
3.搜索
m.find(键值);
4.删除
multimap的删除也是一次性将所有重复的键值删完
m.clear() ; 清空
五、deque双端容器队列与queue队列容器 (头文件分别为 #include<deque> 和#include<queue>)
区别:deque在头部,尾部和中间都能插入和删除元素,queue只能在尾部插入,在头部删除
1.建立
deque<int> d(10,8) 创建具有十个值均为8的容器
2.添加元素
d.push_back(8); 从尾部插入
d.push_front(8); 从头部插入
d.insert(d.begin()+2,8);
3.元素数目
d.size();
4.删除元素
d.pop_back(); 从尾部删除
d.pop_front(); 从头部删除
d.erase("迭代器位置");
d.clear(); 清空
queue的使用方法
入队 p.push() 出队p. pop() 读取队首元素p.front()读取队尾元素p.back() 判断是否为空 p.empty() 元素数目 p.size()
六、list双向链表容器 (头文件 #include<list>)
1.创建
list<int> l(10); 创建具有十个元素的链表
2.添加(与deque相同)
l.push_back(); l.push_front(); l.insert(迭代器位置,元素);
3.删除
l.remove(2); 删除等于2的所有元素
l.pop_back(); l.pop_front();
l.erase(迭代器位置);
l.clear(); 清空链表
4.查找(队列没有查找功能) 需要在#include<algorithm>头文件下
it=find(l.begin(),l.end(),5); 在链表中查找
if(it!=l.end()) 找到
5.排序(队列没有排序功能)
l.sort();
6.剔除连续相同元素只保留一个 l.unique();
七、stack堆栈容器 (头文件#include<stack>)
特点是先进先出,添加与删除只能在栈顶进行
p.push() ; 入栈 p.pop(); 出栈 p.top(); 栈顶元素 p.empty(); 判断是否为空 p.size(); 判断元素数目
八、bitset位集合容器(先不写保留)
终于写完了。。好累呀
一劳永逸吧。。
相关文章推荐
- STL容器的简单用法总结
- STL容器-map用法总结
- C/C++STL常用容器用法总结
- STL中map容器用法总结
- 【STL容器-vector用法总结(1)】
- STL各容器用法总结
- STL中map容器用法总结
- C++ 动态数组类模板(向量容器)vector与STL用法总结
- STL中的map容器的一点总结
- STL中的list容器的一点总结
- C++ STL之map用法总结
- 【STL源码剖析读书笔记】STL容器迭代器失效问题总结
- STL学习总结之初入容器
- STL容器-- stack 用法
- STL容器学习总结
- stl容器学习总结
- 几种STL容器的基本用法[资料]
- STL容器总结之Vector
- 性能特性测试系列1——STL容器,QT容器性能相关比较和总结
- STL 容器特点简单总结