如何从std :: string中删除重复的字符

use*_*422 1 c++ stl

我有std::string这样的:

std::string fileName;
Run Code Online (Sandbox Code Playgroud)

其中,fileName就像/tmp/fs////js//config.js 它是从什么地方来,我需要将它存储.但是当我存储它时,我需要从路径中删除额外的'/'字符,基本上只需要一个目录名和文件名之间的分隔符.

我可以通过一次迭代字符串一个char并与下一个char进行比较来删除它们,但它不是非常有效.

谁能建议一些有效的方法来做到这一点?

Bla*_*ace 8

删除重复的相邻元素是一项工作std::unique.在这种情况下,你需要提供自己的谓词,但它是O(n)而且很简单.

struct both_slashes {
    bool operator()(char a, char b) const {
        return a == '/' && b == '/';
    }
};

std::string path("/tmp/fs////js//config.js");

path.erase(std::unique(path.begin(), path.end(), both_slashes()), path.end());
Run Code Online (Sandbox Code Playgroud)


Pau*_*ams 5

你不会找到比这更有效的东西 - 想一想 - 你需要删除连续的重复字符 - 即使在最好的情况下,你也必须至少看一次每个角色.

  • 这不是100%的真实.实际的天真算法不是O(N),而是O(N ^ 2)(每个字符删除本身就是一个线性操作,因为它需要从该位置到字符串末尾的所有元素被*移动*)然后同样,在大多数情况下,除非字符串很大并且有大量重复,否则它可能仍然比需要复制的纯线性算法更有效. (2认同)