2017-06-17 36 views
0

我有一个载体容器的内容:单一模板函数构建的使用,以显示不同的容器

deque<int> deq; 
deq.push_front(1); 
deq.push_front(2); 
deq.push_front(3); 

我想有一个显示的模板函数:使用

vector<int> v1; 
v1.push_back(1); 
v1.push_back(2); 
v1.push_back(3); 

和deque容器构造这两个容器的内容以及所有数据类型。对于不同的数据类型处理我做了一个模板函数是这样的:

template <typename T> 
void display(vector<T> vec) 
{ 
    for(int i = 0; i < vec.size(); ++i) 
    { 
     cout << vec[i] << endl; 
    } 
    cout << endl; 
} 

目前其载体的工作,我怎样才能使它像双端队列,并列出所有容器工作?

回答

2

我猜你可能会使用范围为基础的for循环:

template<typename C> 
void display(const C& container) 
{ 
    for (const auto& e : container) 
    { 
     std::cout << e << std::endl; 
    } 
} 
3

这些方针的东西,也许是:

template <typename C> 
void display(const C& container) { 
    std::copy(std::begin(container), std::end(container), 
    std::ostream_iterator<decltype(*std::begin(container))>(std::cout, "\n")); 
} 
+0

为什么'decltype(* std :: begin(container))'而不是'typename C :: value_type'? – Caleth

+2

@Caleth为什么不呢?这种方式对'C'的要求较少。 –

+0

这不会调用每个容器元素的复制构造函数吗? – jschultz410

1

许多STL容器支持范围与对作为价值类型,因此

#include <iostream> 
#include <deque> 
#include <vector> 
#include <map> 

using std::cout; 
using std::endl; 

namespace detail { 
    template <typename First, typename Second> 
    void print_element(const std::pair<First, Second>& pr) { 
     cout << pr.first << " " << pr.second << endl; 
    } 

    template <typename Type> 
    void print_element(const Type& element) { 
     cout << element << endl; 
    } 
} // namespace detail 

template <typename Container> 
void print_all(const Container& container) { 
    for (const auto& element : container) { 
     detail::print_element(element); 
    } 
} 


int main() { 

    auto v = std::vector<int>{1, 2, 3}; 
    auto d = std::deque<int>{1, 2, 3}; 
    auto m = std::map<int, int>{{1, 2}}; 
    print_all(v); 
    print_all(d); 
    print_all(m); 

    return 0; 
} 
+1

好奇,我很好奇(抱歉无法帮助它),为什么你只为std :: pair做一个特殊情况? – jschultz410

+0

@ jschultz410,因为像'std :: unordered_map'和'std :: map'这样的容器在使用它们的迭代器迭代时具有'std :: pair'作为值类型。是否有任何其他值包装STL容器使用,我错过了考虑? – Curious

+1

我想如果你想更通用一些,你会专注于std :: tuple。我的观点是,可能有各种各样的类型没有输出操作符。我只是想知道为什么你选择std :: pair进行特殊处理。我猜是因为它是标准库中的一种常见类型,是一个很好的理由。 – jschultz410

相关问题