交换原始指针和迭代器
Interchanging raw pointers and iterators
我想声明并实现一个函数,该函数接受指针或迭代器作为形参。也就是说像
这样的东西void run_through(const Itr& begin, const Itr& end)
{
for (Itr it = begin; it != end; ++it)
std::cout << *it << " ";
}
我希望它可以被迭代器或指针调用。也就是说……
int main(int, char**)
{
int a[] = {3, 1, 4, 1, 5, 9};
std::vector<int> A(a, a+6);
std::set<int> B(a, a+6);
run_through(a, a+6);
run_through(A.begin(), A.end());
run_through(B.begin(), B.end());
return 0;
}
我想知道的是,如果我可以在没有任何模板参数的情况下声明run_through
,并在单独的.cpp
文件中实现run_through
。
我很确定,如果不使用模板,你就无法实现一个接受指针或迭代器的函数。虽然指针和迭代器在本质上实现了相同的概念,但它们并不是一种类型退化为另一种类型,就像C数组退化为指针那样。
因此,干净的解决方案确实是使用单个模板函数,例如在c++ 98中:template<typename forward_itr>
void run_through(forward_itr begin, forward_itr end)
{
for (forward_itr it = begin; it != end; ++it)
std::cout << *it << " ";
}
你可以手动专门化一个函数模板,这是你在一个单独的源文件中实现函数所必须做的,但是我的建议是把整个函数放在一个头文件中,让编译器处理它。现代的编译器和链接器非常擅长处理这种情况,并避免可能的代码重复。
只需使用模板函数,无需在单独的cpp中实现
template <class Itr>
void run_through(Itr&& begin, Itr&& end)
{
for (Itr it = begin; it != end; ++it)
std::cout << *it << " ";
}
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 不明白迭代器,引用和指针失效,一个例子
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 在C++中释放内存期间,迭代器与指针有何不同
- 迭代器的指针操作问题
- 对于随机访问迭代器(矢量迭代器),迭代器C++样式指针吗?
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 迭代器是否分配内存(如指针)?
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 向量<pointer>:插入(迭代器,指针)插入垃圾值
- 迭代器可以变成指针吗?
- 使用迭代器指针 (C++) 从对象指针列表中删除元素
- 迭代器指针不引用第一个元素
- "strong"迭代器指针/引用
- c++ 如何将迭代器指针传递给通过引用需要对象的函数
- 泛型迭代器/指针初始化
- 断言模板实参是一个迭代器/指针
- 将输入迭代器(指针)复制到vector