确定std :: string是否具有所有唯一字符[C ++]

时间:2013-06-25 00:11:53

标签: c++ std

我有一个看似非常简单的解决方案:

void determineStringUnique(std::string str) {
    std::sort(str.begin(), str.end()); //sort characters
    std::unique(str.begin(), str.end()); //remove duplicate characters in a row (why we did std::sort right before)
    std::cout << str.size() << std::endl;
}

(我意识到这个功能尚未完成,我只是在调查std :: unique之后的大小。剩下要做的就是检查新大小是否等于原始大小 - 如果是,那么只有独特的字符。)

但是当我打印出str.size()时,它总是等于原始字符串长度。经过一些调试后,我发现std :: unique删除了预期的(重复的)字符,但是字符串中总有一些地方添加了一些字符,等等。我无法弄清楚原因。

以下是输入示例:“abcdefghijklmnopabc”。在std :: sort之后,我得到了“aabbccdefghijklmnop”,正如所料。但是在std :: unique之后,我得到了“abcdefghijklmnopnop”,这意味着它最后添加了“nop”,但是在开头时确实摆脱了额外的a,b和c。

如果有人对此有答案,我们将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:6)

正如你所提到的,std::unique()实际上并没有删除元素,只是将它们混乱。它有一个返回值......

int countUniqueCharacters(std::string str)
{
    // e.g. str = "abcdefabc"
    std::sort(str.begin(), str.end());
    // e.g. str = "aabbccdef"
    auto i = std::unique(str.begin(), str.end());
    // e.g. str = "abcdef???" with i pointing to first "?"
    // (in other words, i = str.begin() + 6)
    // Note that "?" is an unknown character, not an actual question mark
    return i - str.begin();
    // returns 6
}

str::unique()功能

答案 1 :(得分:2)

unique有点矫枉过正,有一个功能可以完全符合您的要求。

void determineStringUnique(std::string str) {
    std::sort(str.begin(), str.end()); //sort characters
    std::cout << std::adjacent_find(str.begin(), str.end()) == str.end << std::endl;
}