所以,我基本上有这段代码:
#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>
行的错误,但它看起来很糟糕。
答案 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
}