gpt4 book ai didi

C++ 模板 + 迭代器(菜鸟问题)

转载 作者:太空狗 更新时间:2023-10-29 23:25:14 25 4
gpt4 key购买 nike

在此我要声明的是,我大约一周前开始自学 C++,而我以前的编程经验是使用动态语言(Python、javascript)。

我正在尝试使用通用函数遍历 vector 的内容以打印出项目:

#include <iostream>
#include <algorithm>
#include <vector>

using std::vector;
using std::cout;

template <class T>
void p(T x){
cout << x;
}

int main () {

vector<int> myV;

for(int i = 0; i < 10; i++){
myV.push_back(i);
}

vector<int>::const_iterator iter = myV.begin();

for_each(iter, myV.end(), p);

return 0;
}

代码无法编译。有人会解释为什么吗?

编辑:编译器错误:

error: no matching function for call to 'for_each(_gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<const int, _gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > >&, __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int, __gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > >, <unknown type>)'

谢谢!

最佳答案

尝试:

for_each(myV.begin(), myV.end(), p<int>);

您的代码中有两个错误:

  • 迭代器不是同一类型
  • 函数指针实际上并不是一个指针。
    • 通常的模板化函数可以从那里的参数中推导出来。但是在这种情况下,您实际上并没有使用它,而是将它(或其地址)传递给一个函数(因此模板函数推导的正常规则不起作用)。由于编译器无法推断出您需要使用哪个版本的函数“p”,因此您必须明确说明。

还有一个很好的输出迭代器可以做到这一点:

std::copy(myV.begin(),myV.end(), std::ostream_iterator<int>(std::cout));

另请注意,很少有编译器可以跨函数指针调用优化代码。
尽管如果它是仿函数对象,大多数都能够优化调用。因此,以下可能是函数指针的可行替代方案:

template<typename T>
struct P
{
void operator()(T const& value) const
{
std::cout << value;
}
};

....

for_each(myV.begin(), myV.end(), P<int>());

另一个注意事项:
当您使用模板化方法/函数时,通常通过 const 引用传递比通过值传递更好。如果 Type 的复制成本很高,则按值传递将生成一个可能不是您预期的复制构造。

关于C++ 模板 + 迭代器(菜鸟问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com