我不确定我能找到的答案是否是完成我需要的最简单方法。我将知道如何修改为我的问题的完整解决方案的简单模板是完成以下任务的代码:
-
将两个迭代器作为输入,这两个迭代器指向包含值类型 T 的事物的可迭代容器(向量、列表...)的开头和结尾。
-
返回一个包含输入容器的逐个元素副本的
std::vector<T>
,按从头到尾迭代输入容器完成的任何顺序。
不起作用的东西如下所示:
template<typename Iterator, typename T>
std::vector<T> dumb_copy(Iterator first, Iterator last) { ... }
问题是我需要编译器以某种方式检查我是否得到了指向 T 类型的迭代器。
我目前正在学习C++,并编写我能想到的某些算法的最通用的实现,所以我想从一开始就获得最佳实践。如果有一个简单的方法可以使用 C++11 结构来做到这一点,那对我来说很好。
您可以简单地使用特征来完全删除T
类型,从而自动确定它:
template <typename Iterator>
std::vector<typename std::iterator_traits<Iterator>::value_type>
dumb_copy(Iterator first, Iterator last)
{
std::vector<typename std::iterator_traits<Iterator>::value_type> copy;
// Populate the copy vector
return copy;
}
特别要注意的是,当迭代器类型是指针时,std::iterator_traits
具有专用性,因此这将允许你的函数"正常工作",即使它被传递指针而不是"真正的"迭代器对象。
您不需要这样做,因为标准库容器已经以这种方式工作。因此,您可以直接从两个迭代器创建std::vector
:
#include <string>
#include <vector>
#include <iostream>
int main()
{
std::string s = "hello"; // iterable container
// construct a vector using two iterators
std::vector<std::string::value_type> v(s.begin(), s.end());
// check the results
for(unsigned i = 0; i < v.size(); ++i)
std::cout << v[i];
std::cout << 'n';
}
您可以创建一个类型与其中一个迭代器的*it
结果匹配的std::vector<T>
:
#include <type_traits>
#include <vector>
template <typename Iterator>
auto dump_copy(Iterator begin, Iterator end)
-> std::vector<typename std::decay<decltype(*begin)>::type> {
return std::vector<typename std::decay<decltype(*begin)>::type(begin, end);
}
使用 C++14,您可以将typename std::decay<X>::type
替换为 std::decay_t<X>
.