单个模板函数,用于显示不同容器

时间:2017-06-17 13:18:01

标签: c++ list templates vector deque

我有一个使用以下构造的矢量容器:

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

使用以下构造的deque容器:

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

我想要一个模板功能,显示这两个容器的内容以及所有数据类型。为了处理不同的数据类型,我创建了一个模板函数:

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

目前正在为vector工作,如何让它适用于所有容器,如deque和list?

3 个答案:

答案 0 :(得分: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"));
}

答案 1 :(得分:2)

我猜你可能会使用基于范围的for-loop:

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

答案 2 :(得分: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;
}