Это особенность, а не ошибка.Это способ создания std::map
- обход красно-черного дерева, на котором основана карта, всегда в порядке ключа карты.
Возможно, вы захотите попробовать std::unordered_map
, но вы не получите желаемых результатов.Это будет проходить в порядке, который вы могли бы также назвать «случайным».
Если вы хотите сохранить исходный порядок символов, появляющихся в строке, вам придется сделать это самостоятельно.Но вы можете сделать это и построить строку результата одновременно:
string removeDuplicatesKeepingOriginalOrder(string const& s)
{
// string& s = "asdasdasd"
string result;
std::map<char, int> index;
auto si = s.begin();
auto se =s.end();
while (si!=se)
{
auto f = index.find (*si);
if (f==index.end())
{
++index[*si];
result.push_back(*si);
++si;
}
}
return result;
}