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


Использовать 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;
}
Если в качестве ключа ты добаляешь разные экземпляры, то, думаю, это уже не считается одинаковым ключом. В данном случае вектор всегда передаётся по значению, а именно копируется.
И ещё, если ты добавляешь по значению вектор в качестве ключа (а так и есть), то этот вектор копируется в словарь и при следующем добавлении ты добавляя изменённый вектор вызываешь его копирование, а у копии уже другое кол-во элементов в векторе. Если я всё верно понял. Без кода сложно сказать.
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;
}
Александр Дутов
Мда, сайт режет угловые скобки хорошо, что я ссылки оставил
Алексей М.
Согласен, дубликаты должны сами убираться. Но почему то в моем выводе остаются все дубликаты





Алексей М.
https://pastebin.com/J8gMyDxC
Вопрос бессмыслен. В map не может быть повторяющихся пар с одинаковыми ключами и значениями.
Похожие вопросы
- Поиск наибольшего отрицательного элемента массива (c++) и его удаление, написал программу, где то косячек =/
- Как сделать добавление удаление редактирование EF C#
- Дубликаты в СИ
- Всем доброго времени суток, я хотел бы узнать о контейнере map. Что он выполняет в данном коде? Заранее спасибо.
- Что делаю не так? C++.Удаление элемента массива
- С/C++ работа с файлами, удаление и вывод на экран заранее не известных файлов
- Учусь програмировать на C++ по книге "C++ для чайников".Проблема.
- Помогите срочно C#
- Помогите исправить ошибку в программе (c++).
- Зачем нужен C++, если есть C?