单一模板函数构建的使用,以显示不同的容器
我有一个载体容器的内容:单一模板函数构建的使用,以显示不同的容器
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;
}
目前其载体的工作,我怎样才能使它像双端队列,并列出所有容器工作?
我猜你可能会使用范围为基础的for循环:
template<typename C>
void display(const C& container)
{
for (const auto& e : container)
{
std::cout << e << std::endl;
}
}
这些方针的东西,也许是:
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"));
}
许多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;
}
好奇,我很好奇(抱歉无法帮助它),为什么你只为std :: pair做一个特殊情况? – jschultz410
@ jschultz410,因为像'std :: unordered_map'和'std :: map'这样的容器在使用它们的迭代器迭代时具有'std :: pair'作为值类型。是否有任何其他值包装STL容器使用,我错过了考虑? – Curious
我想如果你想更通用一些,你会专注于std :: tuple。我的观点是,可能有各种各样的类型没有输出操作符。我只是想知道为什么你选择std :: pair进行特殊处理。我猜是因为它是标准库中的一种常见类型,是一个很好的理由。 – jschultz410
为什么'decltype(* std :: begin(container))'而不是'typename C :: value_type'? – Caleth
@Caleth为什么不呢?这种方式对'C'的要求较少。 –
这不会调用每个容器元素的复制构造函数吗? – jschultz410