【问题标题】:Show every container element with for_each function使用 for_each 函数显示每个容器元素
【发布时间】:2015-10-30 09:07:03
【问题描述】:

我想更多地了解模板。我尝试编写自己的函数,显示每个容器元素。

void show_element(int i){
std::cout << i << endl;
}

int main(){

int dataarr[5]={1,4,66,88,9};
vector<int> data(&daten[0],&daten[0]+5);

std::for_each(data.begin(),data.end(),show_element) 

...

我的 show_element 函数还不是通用的。我如何编写它,以便我可以将它用于不同的容器类型?

template <typename T>
using type = typename T::value_type;
void show_element(type i){ //type i must be sthg like *data.begin()
std::cout << i << endl;
}

非常感谢

【问题讨论】:

    标签: c++ algorithm vector foreach


    【解决方案1】:

    改为:

    template <typename T>
    void show_element(T const &i) { std::cout << i << std::endl; }
    

    for_each 按顺序将给定函数(例如 show_element)应用于解除引用范围 [first, last) 中每个迭代器的结果。所以不需要取容器的value_type。

    同样在 c++14 及更高版本中,您可以定义一个通用 lambda:

    auto show_element = [](auto const &i) { std::cout << i << std::endl; };
    

    并将其用作:

    int arr[] = {1, 4, 66, 88, 9};
    std::vector<int> data(arr, arr + sizeof(arr) / sizeof(int));
    std::for_each(arr, arr + sizeof(arr) / sizeof(int), show_element);
    

    LIVE DEMO

    【讨论】:

      【解决方案2】:

      使用类比使用函数更灵活。在这种情况下,您可以将其他参数传递给功能对象。

      例如,您可以指定要输出元素的流或将流中的元素分开的分隔符。

      类可以如下所示

      #include <iostream>
      #include <string>
      #include <vector>
      #include <algorithm>
      
      template <typename T>
      class show_elements
      {
      public:
          show_elements( const std::string &separator = " ", std::ostream &os = std::cout ) 
              : separator( separator ), os( os ) {}
          std::ostream & operator ()( const T &value ) const
          {
              return os << value << separator;
          }
      protected:
          std::string separator;
          std::ostream &os;
      };    
      
      int main()
      {
          int arr[] = { 1, 4, 66, 88, 9 };    
          std::vector<int> v( arr, arr + sizeof( arr ) / sizeof( *arr ) );
      
          std::for_each( v.begin(), v.end(), show_elements<int>() );
          std::cout << std::endl;
      }
      

      程序输出是

      1 4 66 88 9
      

      【讨论】:

        【解决方案3】:

        另一种简单的方法是使用基于范围的 for 循环。

        for(auto& element : container) {
            cout<<element<<endl;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-04
          • 1970-01-01
          • 2014-05-02
          • 1970-01-01
          • 2018-09-27
          • 1970-01-01
          • 2013-05-04
          • 2020-02-22
          相关资源
          最近更新 更多