Другие языки программирования и технологии

Удаление дубликатов из map C++

Есть map с ключами vector (int), значениями string. В этом mape могут быть повторяющиеся строки, то есть совпадают и ключи и значения этих строк. Как удалить повторяющиеся строки? Использовать find и erase у меня почему-то не получается :( Формат ключей и значений необходимо соблюдать именно такой.
АМ
Алексей М.
1 252
Использовать map, чтобы удалять потом из него дубликаты - это сильно!

Если в качестве ключа ты добаляешь разные экземпляры, то, думаю, это уже не считается одинаковым ключом. В данном случае вектор всегда передаётся по значению, а именно копируется.

И ещё, если ты добавляешь по значению вектор в качестве ключа (а так и есть), то этот вектор копируется в словарь и при следующем добавлении ты добавляя изменённый вектор вызываешь его копирование, а у копии уже другое кол-во элементов в векторе. Если я всё верно понял. Без кода сложно сказать.

https://pastebin.com/2Mb2p2b9

Видишь, нельзя добавить два одинаковых объекта. Ты не удалять дубликаты должен, а правильно добавлять в словарь элементы

#include
#include
#include

int main()
{
using namespace std;

map dictionary;

vector vector1 = { 1, 2, 3 };

dictionary.insert(pair(vector1, "vector1"));
dictionary.insert(pair(vector1, "vector2"));

map::iterator it = dictionary.begin();
for (it = dictionary.begin(); it != dictionary.end(); ++it)
{
cout << " value " << it->second << '\n';
}

return EXIT_SUCCESS;
}

------------------

Я вот о чём
https://pastebin.com/hJJcE1mh
После того, как ты изменил список, то это уже не тот список, который ты ранее добавлял в словарь (map). Понимаешь это? В словаре в качестве ключа лежит его копия.

#include
#include
#include

int main()
{
using namespace std;

map dictionary;

vector* vector1 = new vector{ 1, 2, 3 };

dictionary.insert(pair(*vector1, "vector1"));

vector1->push_back(4);
dictionary.insert(pair(*vector1, "vector2"));

map::iterator it = dictionary.begin();
for (it = dictionary.begin(); it != dictionary.end(); ++it)
{
cout << " value " << it->second << '\n';
}

delete vector1;

return EXIT_SUCCESS;
}

------------------

А вот так можно добавить в словарь указатель на вектор и второй раз ты его уже не добавишь. Вектор можно изменять и всё равно второй раз ты его не добавишь, а значит не будет дубликатов.
https://pastebin.com/U0NfwHt8
#include
#include
#include

int main()
{
using namespace std;

map dictionary;

vector* vector1 = new vector{ 1, 2, 3 };

dictionary.insert(pair(vector1, "vector1"));

vector1->push_back(4);
dictionary.insert(pair(vector1, "vector2"));

map::iterator it = dictionary.begin();
for (it = dictionary.begin(); it != dictionary.end(); ++it)
{
cout << " value " << it->second << '\n';
}

delete vector1;

return EXIT_SUCCESS;
}
Александр Дутов
Александр Дутов
3 192
Лучший ответ
Александр Дутов Мда, сайт режет угловые скобки хорошо, что я ссылки оставил
Алексей М. Согласен, дубликаты должны сами убираться. Но почему то в моем выводе остаются все дубликаты
Вопрос бессмыслен. В map не может быть повторяющихся пар с одинаковыми ключами и значениями.