Форум программистов, компьютерный форум CyberForum.ru

Выборка уникальных строк и вектора - C++

Восстановить пароль Регистрация
 
FarStar
Заблокирован
30.01.2013, 17:53     Выборка уникальных строк и вектора #1
Привет!
Есть вектор строк, содержащий строки, к примеру:
Медвед
Прэвэд
Медвед
Медвед
Стакан
Пока
Хой
Медвед
Водка
Хой
Хой
Водка
Стакан

На выходе хочу получить строковый вектор, содержащий все уникальные элементы без повторов,
тоесть: Медвед, Прэвед, Стакан, Пока, Хой, Водка
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2013, 17:53     Выборка уникальных строк и вектора
Посмотрите здесь:

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк C++
Дан список, элементы которого являются координатами вектора. Найти длину вектора C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А C++
Предикаты. Выборка объектов из вектора по определённому полю C++
Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.01.2013, 19:47     Выборка уникальных строк и вектора #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <string>
 
int main()
{
    setlocale (0, "Russian");
    std::vector<std::string> vs = {"Медвед","Прэвэд","Медвед","Медвед","Стакан",
    "Пока","Хой","Медвед","Водка","Хой","Хой","Водка","Стакан"};
    std::cout<<"Все слова:\n";
    std::copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout<<"\nНе повторяющиеся слова:\n";
    std::sort(vs.begin(), vs.end());
    std::unique_copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    //system("pause");
    return 0;
}
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
30.01.2013, 20:07     Выборка уникальных строк и вектора #3
yuron_477, пара вопросов:
1) это в новой версии стандарта векторы допускают такое заполнение?
2) можно ли без сортировки как-нибудь убрать дубликаты? Чтобы сохранить порядок слов.
FarStar
Заблокирован
30.01.2013, 20:50  [ТС]     Выборка уникальных строк и вектора #4
yuron_477, спасибо большое, разобрался. Но вот по поводу инициализации векторов твоим способом - косяк, даже в 2012-й студии. Пишет (в галимой русской версии )

C++
1
2
3
4
5
6
error C2552: vs: инициализация не агрегированных данных с помощью списка инициализации не допускается
1>          std::vector<_Ty>: типы с базовым классом не являются агрегатными
1>          with
1>          [
1>              _Ty=std::string
1>          ]
Ну да ладно, НО! тут вопрос ещё один каверзный вопрос, как быть, если нужно сделать тоже самое, но слова одинаковые в изначальном списке будут в разных регистрах? Например МЕДВЕД и медвед, или ПрЭвЭд и пРэВэД ??? Тоесть надо вычислить как бы одинаковые слова по буквам, без учёта регистра ....
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
30.01.2013, 20:53     Выборка уникальных строк и вектора #5
Цитата Сообщение от BumerangSP Посмотреть сообщение
yuron_477, пара вопросов:
1) это в новой версии стандарта векторы допускают такое заполнение?
2) можно ли без сортировки как-нибудь убрать дубликаты? Чтобы сохранить порядок слов.
Вопрос, конечно, не мне, но
1) да
2) если с помощью unique_copy, то нет, если важен порядок - то только через собственную функцию
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.01.2013, 02:15     Выборка уникальных строк и вектора #6
Цитата Сообщение от FarStar Посмотреть сообщение
косяк, даже в 2012-й студии
Да, есть такая неприятность. Пользуйтесь MinGW; или std::array для студии.

Цитата Сообщение от FarStar Посмотреть сообщение
но слова одинаковые в изначальном списке будут в разных регистрах? Например МЕДВЕД и медвед, или ПрЭвЭд и пРэВэД
Не совсем понял, какое из слов МЕДВЕД, меДвед или медвед будет уникальным, но для игнорирования регистра символов можно придумать что такое:
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
#include <iostream>
#include <algorithm>
#include <string>
#include <array>
#include <iterator>
#include <functional>
#include <cctype>
 
template<typename Func>
struct compare
{
    bool operator()(const std::string& lhs, const std::string& rhs)
    {
        std::string lhs_temp, rhs_temp;
        lhs_temp = lhs;
        rhs_temp = rhs;
        std::transform(lhs_temp.begin(), lhs_temp.end(), lhs_temp.begin(), std::tolower);
        std::transform(rhs_temp.begin(), rhs_temp.end(), rhs_temp.begin(), std::tolower);
        return Func()(lhs_temp, rhs_temp);
    }
};
 
int main()
{
    setlocale (0, "Russian");
    std::array<std::string, 15> vs = {"Медвед","Прэвэд","Медвед","Медвед","Стакан", "ПрЭвЭд",
        "Пока","Хой","Медвед","Водка","Хой","Хой","Водка","Стакан", "МЕДВЕД"};
 
    
    std::cout<<"Все слова:\n";
    std::copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 
    std::cout<<"\nУникальные слова (без учета регистра):\n";
    std::sort(vs.begin(), vs.end(), compare<std::less<std::string> >());
    std::unique_copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"), compare<std::equal_to<std::string> >());
 
    std::cout<<"\n";
    system("pause");
    return 0;
}
Croessmah
31.01.2013, 02:18
  #7

Не по теме:

Цитата Сообщение от FarStar Посмотреть сообщение
косяк, даже в 2012-й студии.
слово "даже" тут не к месту. Лучше будет "косяк в этой дурной 2012-й студии"

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
31.01.2013, 03:00     Выборка уникальных строк и вектора #8
yuron_477, не компилится, ерроры (из-за того, что $ форум не читает ссылка LWS стала указывать на мой новый код)
Мои 5 копеек
C++
1
std::string lhs_temp(lhs), rhs_temp(rhs);
Добавлено через 7 минут
Вот рабочий вариант:
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
#include <iostream>
#include <algorithm>
#include <string>
#include <array>
#include <iterator>
#include <functional>
#include <clocale>
#include <cstring>
 
bool foo(const std::string &s1, const std::string &s2)
{
    return std::strcoll(s1.c_str(), s2.c_str());
}
 
int main()
{
    setlocale (0, "Russian");
    std::array<std::string, 15> vs = {"Медвед","Прэвэд","Медвед","Медвед","Стакан", "ПрЭвЭд",
        "Пока","Хой","Медвед","Водка","Хой","Хой","Водка","Стакан", "МЕДВЕД"};
 
 
    std::cout<<"Все слова:\n";
    std::copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 
    std::cout<<"\nУникальные слова (без учета регистра):\n";
    std::sort(vs.begin(), vs.end(), foo);
    std::unique_copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"), foo);
    return 0;
}
Добавлено через 46 секунд
http://liveworkspace.org/code/11XWBS
FarStar
Заблокирован
31.01.2013, 10:42  [ТС]     Выборка уникальных строк и вектора #9
yuron_477, а как сделать что в твоём коде результат не выводился в конслоь, а сохранялся в исходном векторе. Тоесть просто напросто из вектора vs просто бы выкидывались повторы?
Я про этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <string>
 
int main()
{
    setlocale (0, "Russian");
    std::vector<std::string> vs = {"Медвед","Прэвэд","Медвед","Медвед","Стакан",
    "Пока","Хой","Медвед","Водка","Хой","Хой","Водка","Стакан"};
    std::cout<<"Все слова:\n";
    std::copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout<<"\nНе повторяющиеся слова:\n";
    std::sort(vs.begin(), vs.end());
    std::unique_copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    //system("pause");
    return 0;
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.01.2013, 14:55     Выборка уникальных строк и вектора #10
C++
1
2
vs.erase( std::unique(vs.begin(), vs.end()), vs.end() );
std::copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
Добавлено через 3 часа 29 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
не компилится, ерроры
Студия этот код без проблем пропускает, но MinGW не хочет. Проблема кроется в std::tolower - если просто без std, то скомпилится. Вот мой исправленный код http://ideone.com/OVyw9x , но правильно обрабатывает только английские символы, но тот же самый код у меня на компьютере на NetBeans IDE + MinGW 4.7.2 обрабатывает все символы правильно. В кодировках не силен, поэтому не могу сказать почему так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 22:25     Выборка уникальных строк и вектора
Еще ссылки по теме:

Запись вектора строк в массив указателей на тип char C++
C++ Ошибка заполнения вектора строк в классе
C++ Вывод содержимого вектора с наибольшим количеством строк

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
31.01.2013, 22:25     Выборка уникальных строк и вектора #11
yuron_477, tolower определена как макрос и работает с int представлением символов, отсюда лишь латиница
Yandex
Объявления
31.01.2013, 22:25     Выборка уникальных строк и вектора
Ответ Создать тему
Опции темы

Текущее время: 04:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru