STL基础--迭代器和算法

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);

原文地址:https://www.cnblogs.com/logchen/p/10200458.html

时间: 2024-11-02 16:24:02

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

C++笔记(6):标准模板库STL:容器、迭代器和算法

STL(Standard Template Library)是C++标准库的一部分.STL的代码从广义上讲分为三类:容器.迭代器和算法. 1.容器 2.迭代器 3.算法  -------------------------------------------------------------------------------------------------------------------------- 1.容器 顺序容器容器是特定类型对象的集合.顺序容器为程序员提供控制元素存储和访问

C++ STL 基础及应用(3) 迭代器

迭代器(Iterator)是 STL 的核心技术,提供了统一访问容器元素的方法,为编写通用算法提供了坚实的技术基础. 本章将带你编写一个自带迭代器的数组类和一个自带迭代器的链表类,模拟 STL 中的容器,这两个实例能够很清晰地展示 STL 的迭代器思想.并探讨迭代器类应该作为容器类的内部类的原因,然后对 STL 迭代器做一下归纳理解,最后阐述一下 STL 中真正的迭代器概况. 那么什么是迭代器呢? 迭代器即指针,可以是需要的任意类型,它的最大好处是可以使容器和算法分离.例如,有两个容器类,MyA

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

基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接.几乎所有的代码都采 用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会.在C++标准中,STL被组织为下面的13

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

来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求.容器自身可能由数组或链表实现,或者容器中的每个元素都有特殊的关键值. 迭代器 用于遍历一个数据集中的每个元素.这些数据集可能是容器或者容器的子集.迭代器的主要优点是它们为任意类型的容器提供一个小巧并且通用(注意通用很重要)的接口.例如,迭代器接口的一个操作

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

STL之迭代器(iterator)

1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iterator>中. 2 迭代器类型 迭代器共分为五种,分别为: Input iterator.Output iterator.Forward iterator.Bidirectional iterator.Random access iterator. 2.1 Input(输入)迭代器 只能一次一个向前读取

STL 源码剖析 算法 stl_algo.h -- search_n

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search_n ---------------------------------------------------------------------------------------- 描述:在序列[first, last) 所涵盖的区间中,查找"连续 count 个符合条件之元素"所形成的子序列, 并返回迭代器 last 思路: 1.首先找出 value 第一次出现点

STL 源码剖析 算法 stl_algo.h -- lower_bound

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie lower_bound(应用于有序区间) -------------------------------------------------------------------------------------------------------------------------- 描述:二分查找,返回一个迭代器指向每一个"不小于 value "的元素, 或 value 应该

STL 源码剖析 算法 stl_algo.h -- upper_bound

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie upper_bound(应用于有序区间) ------------------------------------------------------------------------------------------------------------------------------------------------- 描述:受STL区间前闭后开习惯的影响,upper_boun