Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95

Как убрать дублирующиеся (повторяющиеся) слова, используя <set> или <map> без сортировки?

14.06.2017, 19:05. Показов 6258. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пытаюсь убрать из текстового файла дублирующие слова, чтобы они были уникальны без сортировки, но моя попытка не увенчалось успехом.
Есть текстовый файл с именами:
Kavi Sharma
Leong Siok Jen
Elizabeth
Kavi Sharma
Elizabeth
Jane Lim
Leong Siok Jen


Вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iterator>
#include<iostream>
#include<algorithm>
#include<string>
#include<fstream>
#include<set>
using namespace std;
 
int main()
{
      string name;
 
    set <string> nameList;
 
    char fileName[50];
 
        cout << "Please Enter file name: ";
    cin >> fileName;
 
    ifstream read(fileName);
    if(!read){
        cout << "File not found!" << endl;
        return -1;
    }
 
 
    while(read.good()){
   
         if(!read.eof()){
               copy(istream_iterator<string>(read),istream_iterator<string>(),inserter(nameList,nameList.end()));
    }
    }
    read.close();
 
 
        cout<<endl;
        copy(nameList.begin(),nameList.end(),ostream_iterator<string>(cout," "));
        cout<<endl<<endl;
 
    return 0;
 
}
У меня получается, но он автоматически сортирует. Нельзя ли это сделать без сортировки?

Добавлено через 1 минуту
Пытался сделать без, но никак не выходит
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2017, 19:05
Ответы с готовыми решениями:

Как убрать повторяющиеся данные в форме, без запроса?
Доброе утро. Подскажите, есть база данных, в ней есть форма которая привязана к таблице. В таблице есть повторяющиеся данные и...

Убрать повторяющиеся буквы из слова
Задание: убрать повторяющиеся буквы из слова оставив первые вхождения #include &quot;iostream&quot; using namespace std; ...

Убрать из текста повторяющиеся слова .
Дан текст . Слова в тексте разделены проблемами . Убрать из текста повторяющиеся слова .

12
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
14.06.2017, 19:13
был уже такой вопрос тут. на него отрицательно ответили. т.е. никак.
unodered варианты не сортируют, но порядок следования слов поменяют.

Добавлено через 5 минут
правда есть такой момент: в том вопросе было что-то вроде что надо использовать только set и ничего больше.
если дополнительные действия возможно - то тогда появляется пространство для маневра.
можно спец предикат написать и использовать set указателей на слова или еще какую-нибудь хитрость.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2017, 19:17
Через map можно сохранить порядок из файла. Он сортирует по ключу, этим можно воспользоваться.
Сделайте ключ числовым типом, и сохраняйте строки по мере чтения под ключами 0,1,2... Таким образом можно будет сохранить порядок строк таким, какой он в файле. А в конце просто пройдитесь по элементам и избавьтесь от дублей(попробуйте с помощью std::unique)
2
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
14.06.2017, 19:19
было бы интересно увидеть решение с std::unique.
1
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95
14.06.2017, 19:27  [ТС]
Undisputed, а как это сделать через <map> не подскажете?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2017, 19:28
almazuulu,
Ну выше я описал алгоритм) увы, пишу с мобилы, не очень удобно кодить
1
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95
14.06.2017, 19:29  [ТС]
Undisputed, я пытался сделать через unique,
C++
1
nameList.erase(unique(nameList.begin(),nameList.end()),nameList.end());
Типа так но ничего дельного из этого не вышло. А как сделать это через <map>?

Добавлено через 39 секунд
Undisputed, А ок. Спасибо и на этом
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
14.06.2017, 19:32
юник требует сортированный интервал для корректной работы - это раз.
в мапине ключи через итераторы менять нельзя. это два.
вышеописанным способом задуманное не сделать.
1
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95
14.06.2017, 20:18  [ТС]
а как прочитать из файла используя unordered_set? Не подскажете?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2017, 20:21
almazuulu,
Насчет юника я ошибся т.к дубли могут не следовать друг за другом. Дубли в принципе можно устранить самыми разными способами(найти их, и избавиться, полагаю, с помощью erase)
1
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
14.06.2017, 20:47
какие-то странные советы даете. найти, явно удалить и т.п. фишка set map и т.п. в том, что в них не положить дубликаты. но они сортируют. вот и предлагается как-то избавится от сортировки и дубликатов с помощью этих контейнеров. а вы предлагаете самостоятельно их удалять. зачем тогда set map? просто чтобы были? это бред но мало ли. вот вам вариант тогда:
C++
1
2
3
4
5
std::vector<std::string> v;
//читаем слова в вектор каким то образом.
std::map<int, std::vector<std::string>> m;
m[0] = v;
//далее работаем с вектором каким-то образом удаляем оттуда дубликаты. мапа была использована. все довольны.
вопросы в моем первом сообщении автора как-то не сильно заинтересовали. ну ссзб значит.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2017, 21:04
Лучший ответ Сообщение было отмечено almazuulu как решение

Решение

DU3,
согласен.. Но в по теме они вроде нужны мапы...

Вот, накатал кое как с мобилки без erase. В векторе набор слов (аналог файла)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//g++  5.4.0
 
#include <iostream>
#include <map>
#include <vector>
 
int main()
{
    std::vector<std::string> filedata{"hello", "world", "hello", "test"};
    
    std::map<int, std::string> data;
    
    int index = 0;
    for (auto& line : filedata){
        bool ignore = false;
        for (auto& v : data){
            if (v.second == line){
                ignore = true;
            }
        }
        if(!ignore){
            data[index] = line;
            ++index;
        }
    }
    for(auto d:data){std::cout << d.second;}
}
http://rextester.com/ACJ56698

Добавлено через 4 минуты
Ещё после ignore = true желательно добавить break;
1
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 95
15.06.2017, 09:14  [ТС]
Наконец-то решил, спасибо всем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2017, 09:14
Помогаю со студенческими работами здесь

Убрать повторяющиеся слова при выводе с Б.Д.
Ну вот собственно хочу убрать повторяющиеся слова которые выходят при выводе на экран с базы данных. То есть первое слово должно...

Убрать из слова, введенного в Edit, повторяющиеся литеры
Здравствуйте. Нужно убрать из слова(X) введенного в Edit повторяющиеся буквы и вывести то что получиться в Label. Заранее благодарен.

Используя множества, удалить из слова повторяющиеся символы
4. Используя множества, удалить из слова повторяющиеся символы.

Полиморфизм или убрать повторяющиеся части кода
Здравствуйте люди, помогите можно ли как то вынести в отдельный класс\метод\функцию\интерфейс или хоть куда нибудь , часть когда которая...

Напомните формулу (убрать или удалить , скрыть, повторяющиеся элементы)
Есть одномерный массив нужно убрать или удалить , скрыть (то что будет проще), повторяющиеся элементы, главное чтобы на экране не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru