我有 map ,哪些键是std::string。我想在 map 中找到以"DUPA/"前缀开头的那些元素。找到下限很容易,但是上限有点问题。我写了这样的代码:

const char* prefix = "DUPA/";
const char* firstAfterPrefix = "DUPA0";
auto prefixedBeginIt = myMap.upper_bound(prefix);
auto prefixedEndIt = myMap.lower_bound(firstAfterPrefix);

该代码可以正常工作,但是我认为它不是很优雅,因为必须知道0在ASCII表中首先在/之后。第二种方法是复制前缀并增加最后一个符号。您知道更优雅的解决方案吗?

最佳答案

我认为您提到的解决方案已经是最优雅的了。 KISS方式会损失很多性能,也就是说,每次都要检查 key :

while(prefixedBeginIt->first == prefix)
{
 //...
 ++prefixedBeginIt;
}

因此,我认为计算下一个字符是最好的方法:
std::string firstAfterPrefix = prefix;
++firstAfterPrefix[firstAfterPrefix.length() - 1];
auto prefixedEndIt = myMap.lower_bound(firstAfterPrefix);

10-07 17:54