我有一个看似非常简单的解决方案:
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。
如果有人对此有答案,我们将不胜感激。谢谢!
答案 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;
}