1 迭代器 Iterators

5种迭代器类型

  1. 随机访问迭代器: vector, deque, array
// 允许的操作
vector<int> itr;
itr = itr + 5; // itr往前移5步
itr = itr - 4;
if (itr2 > itr1) ...
++itr; // 前置的比后置的快
--itr;
  1. 双向迭代器: list, set/multiset, map/multimap
// 允许的操作
list<int> itr;
++itr;
--itr;
  1. 前向迭代器: forward_list
// 只允许++操作
forward_list<int> itr;
++itr; // 无序容器“至少”提供前向迭代器
  1. 输入迭代器: 前向,只能从迭代器读取
int x = *itr;
  1. 输出迭代器: 前向,只能写到迭代器
*itr = 100;

const_iterator

// 每个容器都有iterator和const_iterator
set<int>::iterator itr;
set<int>::const_iterator citr; // 只读访问 set<int> myset = {2,4,5,1,9};
for (citr = myset.begin(); citr != myset.end(); ++citr) {
cout << *citr << endl;
//*citr = 3;
}
for_each(myset.cbegin(), myset.cend(), MyFunction); // Only in C++ 11

2 迭代器函数:

advance(itr, 5);       // itr往前移5步   itr += 5;
distance(itr1, itr2); // 策测量itr1和itr2之间距离

迭代器适配器(预定义迭代器)

  • 一种特殊且更强大的迭代器

    1. Insert iterator
    2. Stream iterator
    3. Reverse iterator
    4. Move iterator (C++ 11)
  1. 插入迭代器 Insert Iterator:
vector<int> vec1 = {4,5};
vector<int> vec2 = {12, 14, 16, 18};
vector<int>::iterator it = find(vec2.begin(), vec2.end(), 16);
insert_iterator< vector<int> > i_itr(vec2,it);
copy(vec1.begin(),vec1.end(), // 源
i_itr); // 目的
//vec2: {12, 14, 4, 5, 16, 18}
// 其他的插入迭代器: back_insert_iterator, front_insert_iterator
  1. 流迭代器 Stream Iterator:
vector<string> vec4;
copy(istream_iterator<string>(cin), istream_iterator<string>(),
back_inserter(vec4)); copy(vec4.begin(), vec4.end(), ostream_iterator<string>(cout, " ")); // 更简洁的写法:
copy(istream_iterator<string>(cin), istream_iterator<string>(),
ostream_iterator<string>(cout, " "));
  1. 反向迭代器 Reverse Iterator:
vector<int> vec = {4,5,6,7};
reverse_iterator<vector<int>::iterator> ritr;
for (ritr = vec.rbegin(); ritr != vec.rend(); ritr++)
cout << *ritr << endl; // prints: 7 6 5 4
  1. 移动迭代器 Move Iterator:
int main () {
std::vector<std::string> foo (3);
std::vector<std::string> bar {"one","two","three"}; typedef std::vector<std::string>::iterator Iter; std::copy ( std::move_iterator<Iter>(bar.begin()),
std::move_iterator<Iter>(bar.end()),
foo.begin() ); // bar now contains unspecified values; clear it:
bar.clear(); std::cout << "foo:";
for (std::string& x : foo) std::cout << ' ' << x;
std::cout << '\n'; return 0;
}

算法 Algorithms

 *   - 大部分是循环
* 当你的代码中出现循环的时候,可以考虑是不是能用STL算法
*/
vector<int> vec = { 4, 2, 5, 1, 3, 9};
vector<int>::iterator itr = min_element(vec.begin(), vec.end()); // itr -> 1 // 注1: 算法总是在半开区间上处理: [begin, end)
sort(vec.begin(), itr); // vec: { 2, 4, 5, 1, 3, 9} reverse(itr, vec.end()); // vec: { 2, 4, 5, 9, 3, 1} itr => 9 // 注2: 算法总是假设目的地有足够的空间
vector<int> vec(3);
copy(itr, vec.end(), // Source
vec2.begin()); // Destination
//vec2至少要有3个元素的空间 // 注3: 大部分情况下使用成员函数版本
vector<int> vec3;
copy(itr, vec.end(), back_inserter(vec3)); // 插入而不是覆写
// 返回back_insert_iterator,每次只插入一个,低效 vec3.insert(vec3.end(), itr, vec.end()); // 高效且安全 // 注4: 算法和函数
bool isOdd(int i) {
return i%2;
} int main() {
vector<int> vec = {2, 4, 5, 9, 2}
vector<int>::iterator itr = find_if(vec.begin(), vec.end(), isOdd);
// itr -> 5
} // 注5: 算法和原生C++数组
int arr[4] = {6,3,7,4};
sort(arr, arr+4);

STL基础--迭代器和算法的更多相关文章

  1. STL(标准模板库)理论基础,容器,迭代器,算法

    基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间.   ...

  2. STL理论基础、容器、迭代器、算法

    一.STL基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段 ...

  3. stl中的容器、迭代器和算法----vector中的find实现

    来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的 ...

  4. stl之容器、迭代器、算法几者之间的关系

    转自:https://blog.csdn.net/bobodem/article/details/49386131 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优 ...

  5. STL的迭代器和类型萃取

    今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于 ...

  6. STL六大组件之——算法小小小小的解析

    参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...

  7. STL中的所有算法(70个)

    STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...

  8. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  9. STL之迭代器(iterator)

    1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iter ...

随机推荐

  1. POJO,JaveBean,VO,DTO

    POJO - POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和EJ ...

  2. Linux如何在(localhost)本地打开html

    自己实验的结果,可能不是最好的办法,方法不唯一 1. 下载Tomcat https://www.cnblogs.com/liangweiping/p/5113857.html 如何查看本机的端口服务 ...

  3. 在windows 上的RedisClient 上连接远程linux redis ("jave.net.ConnectException: Connection refused:connect")

    1.把防火墙禁用掉 2.redis.conf配置文件,注释掉bind 127.0.0.1 3.重启redis服务

  4. HDU 2023 求平均成绩

    Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU ...

  5. Codewars

    You can vote on other Codewarrior's solutions to help uncover the best ones. There are 2 choices for ...

  6. [ZOJ 4062][2018ICPC青岛站][Plants vs. Zombies]

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4062 题目大意:给一个大小为n的数组,数组编号从1到n,每一个元素的值代表 ...

  7. 【HDOJ3567】【预处理bfs+映射+康拓展开hash】

    http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others)    Me ...

  8. 【git】git使用

    1.创建github账户 网站:https://github.com/ 注册省略 2.ssk-key客户端配置 作用:不用每次push,clone代码不需要输入用户名+密码 生成ssh-key ssh ...

  9. 【BZOJ2594】【WC2006】水管局长

    日……又被傻B错坑了一整天…… 原题: SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要 ...

  10. shell dict 操作

    shell 读取文件,利用dict 合并第一列 . #!/bin/bash result_file="a" declare -A mydict total=`cat ${resul ...