顺序容器和简单算法
来源:互联网 发布:如何调用数组方法 编辑:程序博客网 时间:2024/05/19 18:13
容器
一、顺序容器:
1、 概念
它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,即为顺序容器。
2、类型
标准库定义了三种顺序容器的类型:vector、list、deque。
Vector相当于c语言中的数组,list相当于c语言中的链表,而deque则是双端可以插入的vector。
3、语法:
C<T> c; 建立一个空的容器
C c(c2); 把从c2中的内容复制给c
C c(b,e); 把b和e之间的内容复制给容器
容器的容器
vector<vector<string>> lines;
4、在顺序容器中的操作
(1)将元素值复制到容器中
c.push_back(t); //顺序容器都支持的操作
c.push_front(t); //只适用于list和deque容器类型
c.insert(p,t); //在迭代器p所指向的元素前面插入值为t的新元素
(2)访问顺序容器内元素的操作
c.back()//返回容器c的最后一个元素的引用
c.front()//返回容器c的第一个元素的引用
c[n]//返回下标为n的元素的引用只适用于vector和deque容器
c.at(n)//返回下标为n的元素的引用只适用于vector和deque容器
(3)删除元素
c.erase(p) //删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素
c.erase(b,e) //删除迭代器b和e所标记的范围内所有的元素
c.clear() //删除容器c内的所有元素,返回void
c.pop_back() //删除容器c的最后一个元素,返回void
c.pop_front() //删除容器c的第一个元素,返回void 只适用于list和deque容器
(4)赋值与swap
c1=c2删除容器c1的所有元素,然后将c2的元素复制给c1
c1.swap(c2)交换内容:调用完该函数后,c1中存放的是c2原来的元素,C2中存放的则是c1原来的元素。C1和C2的类型必须相同,该函数的执行速度通常要比将c2复制到C1的操作快。
5、迭代器和迭代器范围
*iter返回迭代器iter所指向的元素的引用
iter->mem对iter进行解引用,获取指定元素中名为mem的成员,等效于(*iter).mem
vector和deque支持通过元素位置实现的随机访问,因此它们的迭代器可以有效地实现算数和关系运算。
用于计算vector对象的中点位置:
vector<int>::iterator iter = vec.begin() + vec.size()/2
list容器的迭代器既不支持算数运算(加法或减法),也不支持关系运算(<=,<,>=,>),它只提供前置和后置的自增、自减运算以及相等(不等)运算。
list<int> ilist(vec.begin(),vec.end());
ilist.begin() + ilist.size()/2; //error
6、选择容器类型的法则:
(1)如果程序要求随机访问元素,则应使用vector或deque容器
(2)如果程序必须在容器的中间位置插入或删除元素,则应采用list容器
(3)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则采用deque容器
容器小结:
1、标准库的顺序容器有三个类型
vector:支持随机访问
list:不支持随机访问
deque:支持随机访问
2、 容器的常用操作:
插入:push_back(),insert()
删除:erase()
访问:back()
二、容器算法:
使用泛型算法必须包含algorithm头文件:#include <algorithm>
标准库还定义了一组泛化的算数算法:#include <numeric>
1、 算法accumulate
int sum = accumulate(vec.begin(),vec.end(),42); //sum设置为vec的元素之和再加上42
string sum = accumulate(v.begin(),v.end(),string(“”));
2、 算法replace
replace(ilist.begin(),ilist.end(),0,16); //把0替换为16
3、 算法count
int times = count(ivec.begin(),ivec.end(),0); //替换出现的次数
4、 排序算法
bool cmp(int i,int j) {return i>j;}
int main()
{
vector<int> vec;
for(int i=10;i>-1;i--)
{
Vec.push_back(i);
}
sort(vec.begin(),vec.end(),cmp);
for(int i=0;i<vec.size();i++)
{
cout<< vec[i] << “ ”;
}
cout << endl;
return 0;
}
5、 Find_if算法
bool find_5(int i) {return i==5;}
int main()
{
vector<int>vec;
for(inti=0;i<10;i++)
vec.push_back(i);
vector<int>::iteratorit = find_if(vec.begin(),vec.end(),find_5);
if(it!=vec.end())
cout<< *it << endl;
return 0;
}
- 顺序容器和简单算法
- 第二部分<容器和算法>--顺序容器
- (第二部分)容器和算法——顺序容器
- 【C++ Primer 学习笔记】: 容器和算法之【顺序容器】
- C++ 学习笔记 2.1 : 容器和算法(顺序容器、关联容器、泛型算法)
- 顺序容器和关联容器
- 关联容器和顺序容器
- 顺序容器的简单初始化
- 关联容器和顺序容器的差别
- 顺序容器和关联容器的比较
- STL1——顺序容器和顺序容器适配器
- 简单容器和迭代器
- C++容器和算法
- 容器和算法
- 容器和算法
- C++容器和算法
- 容器和算法
- [C++]容器和算法
- Java-Java I/O流解读之基于字节的I / O和字节流
- linux cd pwd 命令
- AWK里的语法
- Spring @JsonView使用
- Mysql truncate 表以后如何释放空间
- 顺序容器和简单算法
- 内部类、内部接口
- 【数据库】——函数
- Git使用集锦
- uva 11181 条件概率
- matlab中的uint8
- 解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
- windows安装配置mysql实测成功
- LeetCode 209. Minimum Size Subarray Sum