#include <iostream>
#include <array>
using namespace std;
int main()
{
array<int, 5> a = {1,2,3,4,5};
auto it = find(a.cbegin(), a.cend(), 3);
cout << *it << endl;
return 0;
}
该程序使用VS 2015很顺利,但无法使用gcc进行编译。代码错了吗? 错误消息是:
error: no matching function for call to ‘find(std::array<int, 5ul>::const_iterator, std::array<int, 5ul>::const_iterator, int)’
答案 0 :(得分:5)
你需要
#include <algorithm>
这就是std::find
生活的地方。在MSVC中,您可以通过<iostream>
或<array>
中的一些传递包含它。
我还建议完全限定标准库组件的名称,例如std::array
和std::find
,而不是using namespace std;
。请参阅here或here。它清楚地表明您正在尝试使用标准库find
,而不是其他东西。
在尝试打印之前,最好检查一下find
实际发现了什么。如果您尝试find
一个不存在的值,那么打印它会导致Undefined Behaviour,这是一件坏事。
auto it = std::find(a.cbegin(), a.cend(), 3);
if ( a.cend() == it ) {
std::cout << "Couldn't find value!\n";
return 1;
}
std::cout << *it << '\n';
return 0;
我也不是std::endl
的忠实粉丝。您知道它写了'\n'
并刷新了流吗?很多人都没有意识到它会做两件事,这使得你的代码的意图不太清楚。当我阅读它时,我不知道写它的人是否确实想要刷新流,或者只是不知道std::endl
这样做。我更喜欢使用
std::cout << '\n';
,或者如果你真的想要手动刷新流(不太可能),请明确说明:
std::cout << '\n' << std::flush;