std :: find()无法用gcc编译

时间:2015-12-22 09:10:04

标签: c++

#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)’

1 个答案:

答案 0 :(得分:5)

你需要

#include <algorithm>

这就是std::find生活的地方。在MSVC中,您可以通过<iostream><array>中的一些传递包含它。

我还建议完全限定标准库组件的名称,例如std::arraystd::find,而不是using namespace std;。请参阅herehere。它清楚地表明您正在尝试使用标准库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;