2015-10-30 21 views
0

我喜欢更多地了解模板。我试图写我自己的函数,它显示每个容器元素。使用for_each函数显示每个容器元素

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

非常感谢

回答

2

更改为:

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

for_each在区间[first提领每次迭代的结果应用给定的功能(例如,show_element),最后),为了。所以你不需要使用容器的value_type。

在C++ 14

而且以上,你可以定义一个通用的λ:

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

1

取而代之的是功能更的灵活使用课堂。在这种情况下,您可以将其他参数传递给功能对象。

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

类可以看起来如下方式

#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 
0

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

for(auto& element : container) { 
    cout<<element<<endl; 
} 
相关问题