std :: find出错

时间:2015-06-28 19:23:36

标签: c++ std

所以,我基本上有这段代码:

#include <algorithm>
using std::vector;

int WpMaxSAT::findInClause(int clause, int var, ClauseType type)
{
    switch (type) {
    case SOFT:
        int val = std::find(softClauses.at(clause).begin(),
                            softClauses.at(clause).end(), var);
        break;
    case HARD:
        break;
    }

}

其中softClauses在标题中定义为:

std::vector<std::vector<int>> softClauses;

这让我回到了这个错误:

wpmaxsat.cpp: In member function ‘int WpMaxSAT::findInClause(int, int, WpMaxSAT::ClauseType)’:
wpmaxsat.cpp:84:66: error: cannot convert ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’ to ‘int’ in initialization
                             softClauses.at(clause).end(), var);

请注意我与朋友并行工作,因此构造函数尚未定义(他正在研究它)。但我认为问题不在于初始化。

我认为这是#include<algorithm>行的错误,但它看起来很糟糕。

1 个答案:

答案 0 :(得分:1)

std::find返回迭代器,而不是值。您可以阅读编译器抱怨的内容并自行解决。

这应该如何正确编写代码:

auto it = std::find(softClauses.at(clause).begin(),
                    softClauses.at(clause).end(), var);

if (it != softClauses.at(clause).end()) {
    int val = *it;
}

如果您只想知道var中存在的值vector,则可以使用std::count。它不返回迭代器,而是返回某种类型InputIterator::difference_type,它是:

  

符号整数类型

我将size_t视为STL容器的常规处理方式。 使用std::count很简单:

auto count = std::count(softClauses.at(clause).begin(),
                        softClauses.at(clause).end(), var);

if (count) {
    // value exists here
}