如何编写通用函数来打印开始和结束迭代器元素
How to write a generic function to print begin and end iterator elements
下面的函数 printloop 能够打印集合中的元素,如下所示。但是,如果我尝试删除循环并使用 std::copy,我如何才能使该版本(打印)正常工作?
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
// this print function doesn't compile
template <typename iter>
void print(iter begin, iter end) {
std::copy(begin, end,
std::ostream_iterator< what type? >(std::cout, "\t"));
}
template <typename iter>
void printloop(iter begin, iter end) {
while (begin != end) {
std::cout << *begin << '\t';
begin++;
}
}
int main() {
std::vector<int> vec {1,2,3,4,5};
printloop(vec.begin(), vec.end()); // works ok
print(vec.begin(), vec.end()); // how to get working?
}
您可以使用 iterator_traits
:
template <typename iter>
void print(iter begin, iter end) {
using value_type = typename std::iterator_traits<iter>::value_type;
std::copy(begin, end, std::ostream_iterator<value_type >(std::cout, "\t"));
}
给定一个迭代器类型iter
,被迭代的类型是
typename std::iterator_traits<iter>::value_type
即使迭代器未定义 iter::value_type
,例如迭代器是原始指针,此解决方案也可以工作。
下面的函数 printloop 能够打印集合中的元素,如下所示。但是,如果我尝试删除循环并使用 std::copy,我如何才能使该版本(打印)正常工作?
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
// this print function doesn't compile
template <typename iter>
void print(iter begin, iter end) {
std::copy(begin, end,
std::ostream_iterator< what type? >(std::cout, "\t"));
}
template <typename iter>
void printloop(iter begin, iter end) {
while (begin != end) {
std::cout << *begin << '\t';
begin++;
}
}
int main() {
std::vector<int> vec {1,2,3,4,5};
printloop(vec.begin(), vec.end()); // works ok
print(vec.begin(), vec.end()); // how to get working?
}
您可以使用 iterator_traits
:
template <typename iter>
void print(iter begin, iter end) {
using value_type = typename std::iterator_traits<iter>::value_type;
std::copy(begin, end, std::ostream_iterator<value_type >(std::cout, "\t"));
}
给定一个迭代器类型iter
,被迭代的类型是
typename std::iterator_traits<iter>::value_type
即使迭代器未定义 iter::value_type
,例如迭代器是原始指针,此解决方案也可以工作。