C++容器和算法
转自:http://www.cnblogs.com/haiyupeter/archive/2012/07/29/2613145.html
容器:某一类型数据的集合。
C++标准顺序容器包括:vector,list,queue
容器初始化

vector<int> t;
for (int i = ; i < ; i ++) {
t.push_back(i);
} vector<int> c; // 空容器
vector<int> c1(t); // 容器t的副本
vector<int> c2(, ); // 3个值为4的容器
vector<int> c3(t.begin(), t.end() - ); // 容器t的begin()和end()-10之前的数据副本
vector<int> c4(); // 创建包含5个空默认值的副本

容器类型的规则:支持复制和赋值操作
容器的迭代访问
窗口的迭代访问非常类似指针的操作,都支持++和--的位移操作,迭代器内置了操作符重载。

*item
item->num
++item
item++
--item
item--
iter1 == iter2
iter1 != iter2

迭代器访问

for (vector<string>::iterator iter = strs2.begin(); iter != strs2.end(); iter ++) {
std::cout << *iter << std::endl;
}

迭代器的首元素迭代器和尾元素迭代器可以通过begin()和end()方法获取,并通过++方法进行迭代。
迭代器操作的API:
Iterators:
- begin Return iterator to beginning (public member function )
- end Return iterator to end (public member function )
- rbegin Return reverse iterator to reverse beginning (public member function)
- rend Return reverse iterator to reverse end (public member function)
- 容器的元素类型
Member types
- of template <class T, class Allocator=allocator<T> > class vector;
member type | definition |
---|---|
reference | Allocator::reference |
const_reference | Allocator::const_reference |
iterator | Random access iterator |
const_iterator | Constant random access iterator |
size_type | Unsigned integral type (usually same as size_t) |
difference_type | Signed integral type (usually same as ptrdiff_t) |
value_type | T |
allocator_type | Allocator |
pointer | Allocator::pointer |
const_pointer | Allocator::const_pointer |
reverse_iterator | reverse_iterator<iterator> |
const_reverse_iterator | reverse_iterator<const_iterator> |
- 通过reverse类型属性,可以逆序访问容器的迭代器
增加和删除元素
容器的API提供在具体什么位置增加或者删除元素,或者在什么元素增加或者删除元素:
Modifiers:
- assign Assign vector content (public member function)
- push_back Add element at the end (public member function)
- pop_back Delete last element (public member function)
- insert Insert elements (public member function)
- erase Erase elements (public member function )
- swap Swap content (public member function )
- clear Clear content (public member function)
容器大小
Capacity:
- size Return size (public member function)
- max_size Return maximum size (public member function )
- resize Change size (public member function)
- capacity Return size of allocated storage capacity (public member function)
- empty Test whether vector is empty (public member function)
- reserve Request a change in capacity (public member function)
关联容器
C++的容器算法
最常见的是find方法,C++中的示例:
// 包含必要的头文件
#include <algorithm>

vector<int> vec(, );
vec.push_back();
vec.push_back();
vec.push_back();
vec.push_back();
vec.push_back();
vector<int>::const_iterator result = find(vec.begin(), vec.end(), );
std::cout << << (result == vec.end() ? " is not present" : " is present") << std::endl;

除了少数情况下,C++的容器算法都是在一个范围内的元素进行操作。所以其参数顺序情况一般为:iter_begin, iter_end, search_value。
C++容器使用的算法与数据结构书中大致相同:
1. 只读算法(查找)
2. 写算法(排序)
3. 合并
4. 堆
5. 最大/最小值等
常用只读算法:
....
实践了fill, fill_n, back_inserter, copy, replace, sort, count_if

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
void log(std::string log) {
std::cout << log << std::endl;
}
void apiTest() {
}
int main()
{
vector<int> vec(, );
vec.push_back();
vec.push_back();
vec.push_back();
vec.push_back();
vec.push_back();
vec.push_back();
fill(vec.begin() + , vec.end() - ,);
fill_n(back_inserter(vec), , );
replace(vec.end() - , vec.end(), , );
vector<int>::const_iterator iter = vec.begin();
for (;iter != vec.end();iter++) {
std::cout << *iter << std::endl;
}
vector<int> vec2;
copy(vec.begin(), vec.end(), back_inserter(vec2));
return ;
}

输出结果:
关于容器算法相关一章可参考:http://www.cplusplus.com/reference/algorithm/
C++容器和算法的更多相关文章
- C++ Primer(第4版)-学习笔记-第2部分:容器和算法
第9章 顺序容器 顺序容器和关联容器 顺序容器内的元素按其位置存储和访问. 关联容器,其元素按键(key)排序. 顺序容器(sequential container). 顺序容器的元素排列次序与元素值 ...
- C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器
课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...
- <C++Primer>第四版 阅读笔记 第二部分 “容器和算法”
泛型算法中,所谓"泛型(generic)"指的是两个方面:这些算法可作用于各种不同的容器类型,而这些容器又可以容纳多种不同类型的元素. 第九章 顺序容器 顺序容器的元素排列次序与元 ...
- STL容器及算法题:删除奇数的QQ号
最近思考到这样一个题目:在STL的set和vector容器里存储了1亿个QQ号,编写函数删除奇数QQ号. 1. STL容器简介 首先了解一下 set 和 vector 以及其他类似的 STL 容器: ...
- 【VS开发】【C++语言】reshuffle的容器实现算法random_shuffle()的使用
假设你需要指定范围内的随机数,传统的方法是使用ANSI C的函数random(),然后格式化结果以便结果是落在指定的范围内.但是,使用这个方法至少有两个缺点.首先,做格式化时,结果常常是扭曲的,所以得 ...
- 《STL源码剖析》——第五、六:关联容器与算法
第五章.关联容器 5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层 ...
- C++ Primer笔记 容器和算法(2)
erase 删除后 返回的是删除元素的后一个迭代器位置 int main() { //怎样正确的删除全部元素 循环 int a[]={1,2,3,4,5,6,7,8,9}; vector<in ...
- stl中的容器、迭代器和算法----vector中的find实现
来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的 ...
- STL(标准模板库)理论基础,容器,迭代器,算法
基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. ...
随机推荐
- nodejs上传图片并显示的例子
目标 1. 在浏览器地址栏输入“http://demos/start”,进入欢迎页面,页面有一个文件上传表单: 2. 选择一张图片并提交表单,文件被上传到"http://demos/uplo ...
- C 中变参函数的处理方式
C 函数中变化的参数用‘...’ 表示.变化的参数依旧按照C函数传参的规则入栈,即从右往左依次入栈,保证参数从左往右地址依次升高. 解析变参的主要思想是:将变参缓冲区像容纳了不同类型的数组(当然实际的 ...
- 笔者带你剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)
注:本文部分内容引用本人博客http://gao-xianglong.iteye.com/blog/1973591 前言 在开始讲解淘宝的TDDL(Taobao Distribute Data L ...
- 微信jssdk uploadImage 巨坑
//解决IOS无法上传的坑 if (localId.indexOf("wxlocalresource") != -1) { localId = localId.replace(&q ...
- JSP列表形式显示数据库中的数据 OracleCachedRowSet 实例
现在数据库中有一张用户表,希望用户在jsp页面中输入用户名和密码以及 用户类型,在servlet中插入数据库后,在另一个jsp页面中把数据库中所有的用户名和类型都以列表的形式列出来 可以用Ora ...
- POJ-3669 Meteor Shower(bfs)
http://poj.org/problem?id=3669 注意理解题意:有m颗行星将会落在方格中(第一象限),第i颗行星在ti时间会摧毁(xi,yi)这个点和四周相邻的点,一个人开始在原点,然后只 ...
- asp.net页面过滤所有换行符和多余空格
不知道大家注意到了没有,Google和Baidu网页的HTML源代码是混合在一起的.HTML代码混合在一起,出发点是为了减小网页体积,从而加快网页加载速度. 写个函数把网页HTML源代码的换行符和空格 ...
- getHitRect获取点击控件的位置
public void getHitRect(Rect outRect) Added in API level 1 Hit rectangle in parent ...
- C# 对List成员排序的简单方法
网上看到的方法,实在太方便了,转过来保存,原链接: http://blog.csdn.net/wanzhuan2010/article/details/6205884 using System; us ...
- 快速掌握 Android Studio 中 Gradle 的使用方法 [转http://blog.csdn.net/feelang/article/details/41783317]
Gradle是可以用于Android开发的新一代的 Build System, 也是 Android Studio默认的build工具. Gradle脚本是基于一种JVM语言 -- Groovy,再加 ...