我必须维持一个自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());
}
编译器抱怨说:
错误:没有匹配函数来调用'CSolver :: add_clause(__ gnu_cxx :: __ normal_iterator&lt; int *,std :: vector&lt; int,std :: allocator&lt; int&gt;&gt;&gt;&gt;,size_t)'
我尝试施展它
solver.add_clause((int*)lits.begin(), lits.size());
但仍有抱怨:
错误:类型'__gnu_cxx :: __ normal_iterator&lt; int *,std :: vector&lt; int,std :: allocator&lt; int&gt; &GT; &gt;'输入'int *'
我想快速修复此问题,因为会更改CSolver的界面 改变整个计划。
提前致谢。
答案 0 :(得分:11)
像这样:
solver.add_clause(lits.data(), lits.size());
不要在不了解你正在做什么的情况下添加演员阵容。
该函数需要一个int
的数组,它通过指向第一个元素的指针和大小来询问它们。这是一个常见的C约定。
幸运的是,std::vector
将元素精确地存储为连续数组,因此我们可以获得指向第一个元素(lits.data()
,&lits[0]
,&lits.front()
等的指针。)然后只是传递大小。
答案 1 :(得分:7)
如果可以针对c ++ 11进行编译,则可以使用
solver.add_clause(lits.data(), lits.size());
答案 2 :(得分:4)
这应该适用于没有C ++ 11支持的多个平台:
solver.add_clause(&lits[0], lits.size());
编辑:这里的假设是你只想满足API,你已经调整了向量的大小,以便为操作分配足够的int,并且add_clause方法不会被指针弄乱,分配新的整数,或以其他方式违反堆。
这种解决方法可能的原因是由于向量在堆上的内部连续分配所以指向第一个元素的指针足以将容器用作c样式迭代元素的数组,只要您注意到元素数量。
答案 3 :(得分:2)
您可以像这样使用以避免投射:
solver.add_clause(&(*lits.begin()), lits.size())
这里,取* list.begin()并获取其地址,地址为int *
答案 4 :(得分:0)
solver.add_clause(lits.data(), lits.size());
或我的首选:
solver.add_clause(&lits[0], lits.size());
指的是这里不常见的事情,
但你应该首先考虑即使标准定义了这一点 vector internal storage should be contiguous,这并不意味着它不是 reallocatable 。不幸的是后者经常发生。