Вопрос по std::unordered_set
От: _agg  
Дата: 17.09.21 09:06
Оценка: :))) :))) :))) :))
Вот простейший код с unordered_set:
    std::unordered_set<std::string> us;
    us.insert("ACCOUNT");
    us.insert("MTSID");
    us.insert("OPERNAME");
    us.insert("OPERCODE");
    us.insert("CHECKID");
    us.insert("TRNID");
    us.insert("ACCEPT_CODE");
    us.insert("orderSum");
    for (auto& item : us) {
        std::cout << item.c_str() << std::endl;
    }


После его запуска получаем вот такой результат:

OPERCODE
ACCOUNT
MTSID
OPERNAME
orderSum
TRNID
CHECKID
ACCEPT_CODE

Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?
Re[2]: Вопрос по std::unordered_set
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 22.09.21 09:44
Оценка: 1 (1) +3
Здравствуйте, _agg, Вы писали:

_>>Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?


_>Решил проблему оригинальной последовательности просто, положил рядом и заполнил экземпляр std::list<std::unordered_set<std::string>::iterator>


Вы в курсе, в каких случаях итераторы инвалидируются? У вас такие случаи точно невозможны?
The God is real, unless declared integer.
Re: Вопрос по std::unordered_set
От: LaptevVV Россия  
Дата: 17.09.21 09:20
Оценка: +2
_>Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?
А тебе название контейнера ничего не говорит?
Написано же: НЕУПОРЯДОЧЕННОЕ множество.
В стандартной библиотеке порядок вставки сохраняет только последовательный контейнер.
Но это смотря какие операции тебе надо производить, кроме отслеживания порядка.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Вопрос по std::unordered_set
От: rg45 СССР  
Дата: 25.09.21 07:40
Оценка: 3 (1)
Здравствуйте, netch80, Вы писали:

_>>Решил проблему оригинальной последовательности просто, положил рядом и заполнил экземпляр std::list<std::unordered_set<std::string>::iterator>


N>Вы в курсе, в каких случаях итераторы инвалидируются? У вас такие случаи точно невозможны?


Как выход, можно заменить итераторы на прямые указатели. Указатели остаются валидными, даже когда итераторы инвалидируются: https://en.cppreference.com/w/cpp/container/unordered_set#Notes (за исключением удаления, разумеется).
--
Re: Вопрос по std::unordered_set
От: AleksandrN Россия  
Дата: 20.09.21 15:18
Оценка: +1
Здравствуйте, _agg, Вы писали:

_>Вот простейший код с unordered_set:

_>
_>    std::unordered_set<std::string> us;
_>    us.insert("ACCOUNT");
_>    us.insert("MTSID");
_>    us.insert("OPERNAME");
_>    us.insert("OPERCODE");
_>    us.insert("CHECKID");
_>    us.insert("TRNID");
_>    us.insert("ACCEPT_CODE");
_>    us.insert("orderSum");
_>    for (auto& item : us) {
_>        std::cout << item.c_str() << std::endl;
_>    }
_>


_>После его запуска получаем вот такой результат:


_>OPERCODE

_>ACCOUNT
_>MTSID
_>OPERNAME
_>orderSum
_>TRNID
_>CHECKID
_>ACCEPT_CODE

_>Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?


Сохранить в том порядке, в котором пришли — std::list, std::vector, std::array.

Реализация std::unordered_set — хэш-таблица; При обходе элементы будут не в том порядке, в каком пришли и не упорядочены.
std::list — связанный список;
std::vector — динамический массив;
std::array — массив фиксированной длины;
std::set, std::map — красно-чёрное дерево.

Выбирай, что тебе нужно, в зависимости от свойств этих структур данных.
Re: Вопрос по std::unordered_set
От: Videoman Россия https://hts.tv/
Дата: 17.09.21 09:30
Оценка:
Здравствуйте, _agg, Вы писали:

_>Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?


Не понятно что тебе надо в итоге ?! В STL нет контейнера который бы позволял доступ по индексу (с сохранением порядка) и одновременно давал бы быстрый поиск, если ты об этом?
Тебе нужен какой-нибудь multiindex контейнер или напиши свой. Опять же, всё зависит от задачи.
Re: Вопрос по std::unordered_set
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.09.21 11:11
Оценка:
Здравствуйте, _agg, Вы писали:

_>Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?


Вариант 1: поменять язык
JavaScript уже много лет как делает такое по умолчанию.
Python — начиная с 3.5.
В Java есть LinkedHashMap.

Вариант 2: Сделать таки обёртку вокруг std::unordered_set. Для C++ на вопрос об аналоге отвечают, например, тут, или пытаются написать тут. (set считаем частным случаем map, или наоборот.)

Ещё имеет смысл подумать просто про std::set, если важен фиксированный порядок, а не тот, в котором поступали ключи.
The God is real, unless declared integer.
Re: Вопрос по std::unordered_set
От: _agg  
Дата: 22.09.21 08:15
Оценка:
Здравствуйте, _agg, Вы писали:

_>Вот простейший код с unordered_set:

_>
_>    std::unordered_set<std::string> us;
_>    us.insert("ACCOUNT");
_>    us.insert("MTSID");
_>    us.insert("OPERNAME");
_>    us.insert("OPERCODE");
_>    us.insert("CHECKID");
_>    us.insert("TRNID");
_>    us.insert("ACCEPT_CODE");
_>    us.insert("orderSum");
_>    for (auto& item : us) {
_>        std::cout << item.c_str() << std::endl;
_>    }
_>


_>После его запуска получаем вот такой результат:


_>OPERCODE

_>ACCOUNT
_>MTSID
_>OPERNAME
_>orderSum
_>TRNID
_>CHECKID
_>ACCEPT_CODE

_>Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?



Решил проблему оригинальной последовательности просто, положил рядом и заполнил экземпляр std::list<std::unordered_set<std::string>::iterator>
Отредактировано 22.09.2021 8:16 _agg . Предыдущая версия .
Re[3]: Вопрос по std::unordered_set
От: _agg  
Дата: 05.10.21 08:02
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, _agg, Вы писали:


_>>>Если внимательно посмотреть в какой последовательности вставляли, то при обходе контейнера видно что порядок нарушен, можно ли как то сохранить порядок вставки при обходе ?


_>>Решил проблему оригинальной последовательности просто, положил рядом и заполнил экземпляр std::list<std::unordered_set<std::string>::iterator>


N>Вы в курсе, в каких случаях итераторы инвалидируются? У вас такие случаи точно невозможны?


В данном случае контейнер после добавления в него элементов не изменяется, поэтому итераторы валидны на протяжении всей жизни контейнера.
Re[4]: Вопрос по std::unordered_set
От: wander  
Дата: 06.11.21 13:06
Оценка:
Здравствуйте, _agg, Вы писали:


_>В данном случае контейнер после добавления в него элементов не изменяется, поэтому итераторы валидны на протяжении всей жизни контейнера.


Это вот тоже надо учитывать:

If rehashing occurs due to the insertion, all iterators are invalidated.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.