zoukankan      html  css  js  c++  java
  • c++中的 for_each 函数

    1. c++中的 for_each 函数

    for_each()事实上是個 function template,其源码如下
    link:http://www.cplusplus.com/reference/algorithm/for_each/?kw=for_each

    template<typename InputIterator, typename Function>
    Function for_each(InputIterator beg, InputIterator end, Function f) {
      while(beg != end) 
        f(*beg++);
    }
    能看懂吧!!!
    

    例如:

    // for_each example
    #include <iostream>     // std::cout
    #include <algorithm>    // std::for_each
    #include <vector>       // std::vector
    
    void myfunction (int i) {  // function:
      std::cout << ' ' << i;
    }
    
    struct myclass {           // function object type:
      void operator() (int i) {std::cout << ' ' << i;}
    } myobject;
    
    int main () {
      std::vector<int> myvector;
      myvector.push_back(10);
      myvector.push_back(20);
      myvector.push_back(30);
    
      std::cout << "myvector contains:";
      for_each (myvector.begin(), myvector.end(), myfunction);
      std::cout << '
    ';
    
      // or:
      std::cout << "myvector contains:";
      for_each (myvector.begin(), myvector.end(), myobject);
      std::cout << '
    ';
    
      return 0;
    }
    
    结果:
    myvector contains: 10 20 30
    myvector contains: 10 20 30
    

    foreach其他用法:https://www.cnblogs.com/zhangkele/p/9373063.html

    2. C++11之for循环的新用法

    C++使用如下方法遍历一个容器:

    遍历vector容器
    #include<iostream>
    #include<vector>
    
    int main()
    {
        std::vector<int> arr;
        arr.push_back(1);
        arr.push_back(2);
    
        for (auto it = arr.begin(); it != arr.end(); it++)
        {
            std::cout << *it << std::endl;
        }
    
        return 0;
    }
    

    其中auto用到了C++11的类型推导。同时我们也可以使用std::for_each完成同样的功能:

    #include<algorithm>
    #include<iostream>
    #include<vector>
    
    void func(int n)
    {
        std::cout << n << std::endl;
    }
    
    int main()
    {
        std::vector<int> arr;
        arr.push_back(1);
        arr.push_back(2);
    
        std::for_each(arr.begin(), arr.end(), func);
    
        return 0;
    }
    

    现在C++11的for循环有了一种新的用法:

    #include<iostream>
    #include<vector>
    
    int main()
    {
        std::vector<int> arr;
        arr.push_back(1);
        arr.push_back(2);
    
        for (auto n : arr)
        {
            std::cout << n << std::endl;
        }
    
        return 0;
    }
    

    上述方式是只读,如果需要修改arr里边的值,可以使用for(auto& n:arr),for循环的这种使用方式的内在实现实际上还是借助迭代器的,所以如果在循环的过程中对arr进行了增加和删除操作,那么程序将对出现意想不到的错误。

    遍历map映射容器 三种方式
    
    map<int, string> m;
     // 1
    for (    auto &v : m)  
         {
             cout<<v.first<<" "<<v.second<<endl;
        }
    
     // 2 lamda表达式
     for_each(m.begin(),m.end(),[](map<int,string>::reference a){
             cout<<a.first<<" "<<a.second<<endl;
         });
    
    // 3 for_each
     void fun(map<int,string>::reference a)  //不要少了reference,不然会报错。
    {
             cout<<a.first<<" "<<a.second<<endl;
    }
    for_each(m.begin(),m.end(),fun);
    

    还有一种宏定义的方法实现foreach循环:

    //定义
    #define foreach(container,it) 
        for(typeof((container).begin()) it = (container).begin();it!=(container).end();++it)
    //输出
    foreach(m,it)
        {
            cout<<it->first<<","<<it->second<<endl;
        }
    
    好不容易活着
  • 相关阅读:
    Hive的mysql安装配置
    Linux下的MySQL安装
    Hive的安装与基础指令
    浅谈数据库和数据仓库
    Hive的学习之路(理论篇)
    Spring---bean的命名
    Spring---单例模式(Singleton)的6种实现
    Spring---加载配置文件的几种方法(org.springframework.beans.factory.BeanDefinitionStoreException)
    Spring---配置文件概述
    Spring---Bean生命周期
  • 原文地址:https://www.cnblogs.com/iwana/p/13535736.html
Copyright © 2011-2022 走看看