【问题标题】:Removing strings from a string vector, from a substring从字符串向量中,从子字符串中删除字符串
【发布时间】:2014-03-14 23:18:16
【问题描述】:

我正在将单元子句传播算法实现到 C++ 中。我已经在 CNF 文件中读取了一个向量,其中每个子句都位于向量的单个元素中,例如

1 2 0
1 2 3 0
1 0
3 4 0

到目前为止,我能够隔离单个元素并将它们设置为字符串,因此在此示例中,我会将字符串设置为“1”。

下一步将删除向量中包含 1 的所有元素,因此在此示例中,将删除第 1、第 2 和第 3 个元素。但是,当我运行矢量删除命令时

clauses.erase(std::remove(clauses.begin(), clauses.end(), "1"), clauses.end());

它只会删除恰好为“1”的元素,而不是包含 1 以及其他字符的元素。无论如何要删除包含字符串的向量的任何元素?

(我希望这是有道理的,感谢您的宝贵时间)

【问题讨论】:

    标签: c++ string vector ucp


    【解决方案1】:

    使用std::remove_if 并在字符串中搜索1 (live example):

    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 或任何漂浮的东西都可以。

    【讨论】:

    • 非常感谢您的快速回复,我还有一个问题,[]的用途是什么?因为它在编译中引发错误
    • @Josh,它引入了 lambda,它是 C++11 的一部分,因此您需要在编译器中启用 C++11(例如,-std=c++11)或选择其他选项.
    • 抱歉,我使用的是没有 C++11 标志的旧 makefile。我已经实现了你的代码,但是它似乎没有从向量中删除任何东西。还有什么办法可以用字符串而不是int替换'i'?我将单个元素分配给一个名为“std::string propagator;”的字符串。我将使用它从向量中删除它们。谢谢
    • @Josh,我在我的答案中添加了一个指向一个实时示例的链接,表明它有效。至于你的另一个问题,我不知道你在问什么?什么“我”,什么int?您能否举一个更好的例子来说明您正在尝试做什么?
    • 这对我很有帮助,谢谢。啊,我的意思是 1. 在这一行“{return s.find('1')” 无论如何我可以用“{return s.find(propagator)”替换它。随着字符串传播器在整个程序运行时发生变化。我希望这更有意义,再次感谢您
    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2021-06-24
    • 2014-08-17
    相关资源
    最近更新 更多