279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
1

STL sort строк string по убыванию

06.06.2017, 15:32. Показов 5131. Ответов 7
Метки нет (Все метки)

Как по возрастанию - знаю:
C++
1
2
3
4
5
6
7
std::vector<std::string> obj;
std::string str("asdfghjkl");
vector.push_back(str);
for (auto &index : obj) {
  std::sort(index.begin(), index.end());
  std::cout << index << std::endl;
}
Как сделать по убыванию? На std::sort(index.begin(), index.end(), std::greater<std::string>()); - ругается.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2017, 15:32
Ответы с готовыми решениями:

Список(List) как отсортировать по убыванию используя функции reverse(); sort(); ао убыванию
Нужно отсортировать список по убыванию используя функции reverse(); и sort(); если можно фул прогу...

STL sort()
кто знает и где можно посмотреть за какое время работает сортировка sort() в STL &lt;algorithm&gt;??

stl sort vector не сортирует ?!
class Playlist { private: std::vector&lt;Song&gt; s_container; public: Playlist() {...

реализация Shell Sort в stl
Всем привет! Кто-нибудь знает, есть ли в Stl реализация сортировки Шелла? std::sort()...

7
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.06.2017, 15:38 2
anapshy, так index - строка. В ней элементы типа char
0
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
06.06.2017, 15:40  [ТС] 3
MrGluck, ага, ну так c
C++
1
greater
не работает.
Как бы вы сделали? При том же условии, что строка находится в векторе.
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.06.2017, 15:46 4
У меня так всё работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <algorithm>
#include <iostream>
#include <functional>
#include <string>
#include <vector>
 
int main()
{
    std::vector<std::string> obj;
    std::string str("asdfghjkl");
    obj.push_back(str);
    for (auto &index : obj) {
      std::sort(index.begin(), index.end(), std::greater<char>());
      std::cout << index << std::endl;
    }
}
0
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
06.06.2017, 16:19  [ТС] 5
MrGluck, как этот код у вас себя поведет (50 строка кода - c добавление greather начинает ругаться)?
Создайте input.txt в папке с проектом и напишите туда рандомный текст в несколько строк.
Текст с предложением для ввода кол-ва строк будет отличаться, чем на скриншоте - текст заменил
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
Задание: Указать путь к файлу input.txt в котором находится некоторый текст.
В той же папке создать output.txt содержащий N(нечетных) отсортированных строк файла input.txt.
*/
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <cctype>
#define     Default_name    "output.txt"
void AddSortLineToFile(std::ifstream&, std::string, const std::string, size_t); // 1) Ссылка на ifstream (оттуда будет читать) 2) Путь к файлу 3) Имя файла(оттуда будет читать) 4) Сколько строк записывать?
int main(void)
{
    std::string file_track_in;
    const std::string name_in("input.txt");
    //std::cout << "Enter file name: "; std::cin >> file_track_in;
    std::ifstream file_in(name_in); // *******************
                                    //std::ifstream file_in(file_track_in);
    if (!file_in.is_open())
    {
        std::cout << "**** File " << name_in << " not found! ****" << std::endl << std::endl;
        return 1;
    }
    int number_lines(0); std::cout << "Enter the number of lines which needed delete: "; std::cin >> number_lines; // My English not very well :C
    AddSortLineToFile(file_in, "", name_in, number_lines); // ********************
                                                           //AddSortLineToFile(file_in, file_track_in, name_in, number_lines);
    file_in.close();
    system("pause");
    return 0;
}
 
void AddSortLineToFile(std::ifstream &file_in, std::string path, const std::string file_name_in, size_t number_lines)
{
    std::string path_out = path + Default_name;             // Путь для output
    path += file_name_in;                                   // Путь для input
    std::vector<std::string> sorted_str;                    // Для хранения нечетных/отсортированных строк
    std::string line;                                       // Строки
    size_t count(0);                                        // Счетчик строк
    while (std::getline(file_in, line) && number_lines) {   // Читает строки до тех пор пока не кончатся или пока не соберется нужное кол-во N
        if (++count % 2) {                                      // Если строка не четная
            sorted_str.push_back(line);                             // Записываем в вектор
            --number_lines;
        }
    }
    std::ofstream file_out(path_out, std::ios_base::out);
    for (auto index : sorted_str) {                             // Идем по всему вектору
        std::sort(index.begin(), index.end(), std::greater<char>());                      // Сортируем каждую строку
        for (decltype(index.size()) i(0); i != index.size(); i++)   // Идем по отсортированной строке
            while (isspace(index[i]))                                   // Если найден пробел
                index.erase(i, 1);                                          // Удаляем его
        file_out << index << std::endl;                             // Записываем строку в файл
    }
    file_out.close();
}
Миниатюры
STL sort строк string по убыванию  
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.06.2017, 16:25 6
Лучший ответ Сообщение было отмечено anapshy как решение

Решение

Цитата Сообщение от anapshy Посмотреть сообщение
как этот код у вас себя поведет
Откомпилировался и отработал.
А вот так
Цитата Сообщение от anapshy Посмотреть сообщение
index.erase(i, 1);
делать по итерируемой последовательности нельзя.
Принимайте итератор, который возвращает erase. А лучше используйте erase + std::remove
0
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
06.06.2017, 16:44  [ТС] 7
MrGluck, именно в этом и была ошибка. Исправил -> index.erase(std::remove(index.begin(), index.end(), ' '));
Спасибо
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.06.2017, 16:49 8
anapshy, только надо бы
C++
1
index.erase(std::remove(index.begin(), index.end(), ' '), index.end());
Иначе будет работать лишь с одним пробелом
http://www.cplusplus.com/refer... ing/erase/
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2017, 16:49
Помогаю со студенческими работами здесь

Не работает сортировка Stl sort
вот код сортировки массива обычным stl sort () #include&lt;conio.h&gt; #include&lt;iostream.h&gt;...

С++ Builder STL copy/sort multiset
есть две проблемы: 1) ф-ция copy не компилируеться multiset&lt;double&gt; MS,MS2;...

Ошибка кучи в алгоритме STL sort()
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;ctime&gt; #include &lt;stdexcept&gt;...

(STL LIST SORT) Сортировка по некольким критериям
Здравствуйте! Столкнулся с такой проблемой при сортировке списка. %-) Есть структура: ...

System::String^ vs stl::std::string
В консольном варианте есть программа, которая получает с экрана строку типа string, работает с ней...

Insertion sort по убыванию
Ребят, простите за тупой вопрос. Но как лучше реализовать сортировку вставками по убыванию? А то я...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru