我正在将单元子句传播算法实现到c ++中。我已经在CNF文件中读取了一个向量,其中每个子句都在向量的单个元素中,例如
1 2 0
1 2 3 0
1 0
3 4 0
到目前为止,我能够隔离单个元素并将它们设置为字符串,因此在本例中我将字符串设置为" 1"。
下一步是删除向量中包含1的所有元素,因此在此示例中将删除第1个,第2个和第3个元素。但是当我运行vector remove命令时
clauses.erase(std::remove(clauses.begin(), clauses.end(), "1"), clauses.end());
它只会删除完全" 1"的元素,而不是包含1和其他字符的元素。反正有没有删除包含字符串的向量的任何元素?
(我希望这是有道理的,谢谢你的时间)
答案 0 :(得分:4)
使用std::remove_if
并在字符串(live example)中搜索1:
clauses.erase(
std::remove_if(clauses.begin(), clauses.end(),
[](const std::string &s) {return s.find('1') != std::string::npos;}
),
clauses.end()
);
如果你没有为lambda提供C ++ 11,那么普通的函数或函子,或者Boost lambda,或者你的船漂浮的任何东西都可以。