• 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 << '
    ';
    
      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);
    
  • 相关阅读:
    CF932E Team Work
    BZOJ 4480 [JSOI2013] 快乐的jyy
    CF285E Positions in Permutations
    P4312 [COCI 2009] OTOCI / 极地旅行社
    P3327 [SDOI2015]约数个数和
    P3649 [APIO2014]回文串
    P3181 [HAOI2016]找相同字符
    P3346 [ZJOI2015]诸神眷顾的幻想乡
    P4248 [AHOI2013]差异
    P4512 【模板】多项式除法
  • 原文地址:https://www.cnblogs.com/logchen/p/10200458.html
Copyright © 2020-2023  润新知