我必须维持一个自2004年以来没人接触过的计划.
class CSolver
{
...
ClauseIdx add_clause (int * lits, int n_lits);
}
void and2 (CSolver & solver)
{
vector <int> lits;
...
solver.add_clause(lits.begin(), lits.size());
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说:
错误:没有匹配函数来调用'CSolver :: add_clause(__ gnu_cxx :: __ normal_iterator <int*,std :: vector <int,std :: allocator <int >>>,size_t)'
我试着去投它
solver.add_clause((int*)lits.begin(), lits.size());
Run Code Online (Sandbox Code Playgroud)
但仍有一个抱怨:
错误:从类型'__gnu_cxx :: __ normal_iterator <int*,std :: vector <int,std :: allocator <int >>>>'输入无效,以输入'int*'
我想快速解决这个问题,因为改变CSolver的界面会导致改变整个程序.
提前致谢.
GMa*_*ckG 11
像这样:
solver.add_clause(lits.data(), lits.size());
Run Code Online (Sandbox Code Playgroud)
不要在不了解你正在做什么的情况下添加演员阵容.
该函数需要一个ints 数组,它通过指向第一个元素的指针和大小来询问它们.这是一个常见的C约定.
幸运对我们来说,std::vector存储元件精确地为连续的阵列,所以我们可以得到一个指针的第一个元素(lits.data(),&lits[0],&lits.front(),等),然后只传递的大小.
如果您可以针对c ++ 11进行编译,则可以使用
solver.add_clause(lits.data(), lits.size());
Run Code Online (Sandbox Code Playgroud)
http://en.cppreference.com/w/cpp/container/vector/data