STL基础--迭代器和算法
1 迭代器 Iterators
5种迭代器类型
- 随机访问迭代器: vector, deque, array
 
// 允许的操作
vector<int> itr;
itr = itr + 5;  // itr往前移5步
itr = itr - 4;
if (itr2 > itr1) ...
++itr;   // 前置的比后置的快
--itr;
- 双向迭代器: list, set/multiset, map/multimap
 
// 允许的操作
list<int> itr;
++itr;
--itr;
- 前向迭代器: forward_list
 
// 只允许++操作
forward_list<int> itr;
++itr;
// 无序容器“至少”提供前向迭代器
- 输入迭代器: 前向,只能从迭代器读取
 
int x = *itr;
- 输出迭代器: 前向,只能写到迭代器
 
*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之间距离
迭代器适配器(预定义迭代器)
- 一种特殊且更强大的迭代器
- Insert iterator
 - Stream iterator
 - Reverse iterator
 - Move iterator (C++ 11)
 
 
- 插入迭代器 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
- 流迭代器 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, " "));
- 反向迭代器 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
- 移动迭代器 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基础--迭代器和算法的更多相关文章
- STL(标准模板库)理论基础,容器,迭代器,算法
		
基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. ...
 - STL理论基础、容器、迭代器、算法
		
一.STL基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段 ...
 - stl中的容器、迭代器和算法----vector中的find实现
		
来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的 ...
 - stl之容器、迭代器、算法几者之间的关系
		
转自:https://blog.csdn.net/bobodem/article/details/49386131 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优 ...
 - STL的迭代器和类型萃取
		
今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于 ...
 - STL六大组件之——算法小小小小的解析
		
参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...
 - STL中的所有算法(70个)
		
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
 - 带你深入理解STL之迭代器和Traits技法
		
在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...
 - STL之迭代器(iterator)
		
1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iter ...
 
随机推荐
- [LeetCode&Python] Problem 892. Surface Area of 3D Shapes
			
On a N * N grid, we place some 1 * 1 * 1 cubes. Each value v = grid[i][j] represents a tower of v cu ...
 - VS、ReSharper 设置修改代码颜色、提高代码辨识度!附VS超实用快捷!
			
ReSharper 配置代码颜色 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心 ...
 - windows apache  "The requested operation has failed"  启动失败
			
找到失败原因,进入cmd(win+r快捷键,输入cmd)命令行下 进入到你的apache bin目录下: 每个人错误可能不同,根据自己问题去相应改
 - 《DSP using MATLAB》Problem 5.9
			
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
 - 【java编程】ServiceLoader使用看这一篇就够了
			
转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...
 - SpringBoot企业级博客开发
			
1.springboot生成项目 PS : 进入项目,输入gradle build,生成build文件夹: 然后进入libs有jar,使用java jar进行运行项目 PS: 这个项目没有准守res ...
 - shell command
			
查看网卡流量报告 sar -n DEV kill pid ps -ef |grep xxx |grep -v grep |awk '{print $2}' |xargs ki ...
 - <--------------------------常用的API方法------------------------------>
			
//1.int length(): 返回的是字符串的长度 public static void fun1() { String string = "string"; int i = ...
 - day44 数据库学习 索引 引用自egon 老师博客
			
MySQL索引管理 总结 #索引是存在硬盘中的, #索引的功能, 1.可以加速查询 2.但是他会降低写入和删除的速度 所以不能乱加索引 总结二 1 最左前缀匹配原则 2设置的索引,它的字段中的内容占空 ...
 - webpack 打包产生的文件名中,hash、chunkhash、contenthash 的区别
			
table th:first-of-type { width: 90px; } hash 类型 区别 hash 每一次打包都会生成一个唯一的 hash chunkhash 根据每个 chunk 的内容 ...