0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 37
1

Сортировка диапазона элементов в list (STL)

30.04.2014, 21:14. Показов 1521. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Требуется ввести числа в список, задать числа a и b, изменить порядок элементов, начиная с a-го элемента, заканчивая b-ым элементом. Использовать только стандартную библиотеку.
Числа в список ввел, но абсолютно не понимаю как изменить порядок элементов В ЗАДАННОМ ДИАПАЗОНЕ. Есть метод reverse, но он меняет порядок во всем списке, а мне надо только в части списка.
Получается надо сделать что-то в виде цикла и далее: достать элемент из списка (с помощью какого метода?) и менять его с другим (вроде как метод swap это делает?).

Кусок кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::list <int> numbers;
    char ch = 0;
    while ( ch != 'n' ){
        int x;
        std::cin>>x;
        numbers.push_back(x);
        std::cout<<"continue?('n' to exit)\n";
        std::cin>>ch;
    }
    int k,p;
    std::cout<<"enter the range to change the order\n";
    std::cin>>k>>p;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2014, 21:14
Ответы с готовыми решениями:

List STL сортировка и поиск
Ребят, прошу помощи. Перерыл весь инет, нашёл кучу ссылок, пытался сделать поиск и сортировку, ни...

Поиск и сортировка list STL
Здравствуйте формумчане. Такая проблема. Написал почти рабочий код, но столкнулся с 2-мя...

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

stl, удаление элементов в list
Всем доброго времени суток! прошу помочь в решении задачи: Из числовой последовательности найти...

6
205 / 181 / 112
Регистрация: 15.03.2014
Сообщений: 392
30.04.2014, 22:06 2
Острослав, reverse() позволяет изменять порядок на обратный в указанном диапазоне.
Вот Вам пример.
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
#include <iostream>
#include <list>
#include <algorithm>
 
using namespace std;
 
// функция вывода на экран элементов списка
template < class T >
void PrintList( std::list < T >& lst ) {
    for_each( lst.begin(), lst.end(), []( T n ) {cout << n << " ";} );
    std::cout << endl;
}
 
int main() {
    list < int > numbers;
    const int size = 20, a = 10, b = 15;
 
    // заполнение списка
    int i = 0;
    generate_n( back_inserter( numbers ), size, [i] () mutable {return i++;} );
    // вывод на экран
    PrintList( numbers );
 
    // изменение порядка в указанном диапазоне от a до b
    reverse( next( numbers.begin(), a ), next( numbers.begin(), b ) );
    // вывод измененного списка
    PrintList( numbers );
 
    return 0;
}
Вывод программы
Код
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
0 1 2 3 4 5 6 7 8 9 14 13 12 11 10 15 16 17 18 19
Компилятор с поддержкой C++11.
Ключ
-std=c++11
0
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 37
30.04.2014, 23:02  [ТС] 3
Цитата Сообщение от BlackSpace Посмотреть сообщение
Компилятор с поддержкой C++11.
Ключ
-std=c++11
а если у меня студия 2010, то никак иначе не сделать?
0
205 / 181 / 112
Регистрация: 15.03.2014
Сообщений: 392
30.04.2014, 23:21 4
Лучший ответ Сообщение было отмечено Острослав как решение

Решение

Нету у меня VS 2010, по ней ничего не подскажу.
А в общем случае заполните список, вызывайте reverse() с указанием нужного диапазона итераторами. Сам алгоритм reverse() работает и без поддержки C++11.

Только что проверил - мой код прекрасно собирается на Windows компилятором MinGW, который идет в комплекте с IDE Code::Blocks. Есди задать ключ для C++11.
Ссылка на скачивание с официального сайта
http://www.codeblocks.org/downloads/26
Файл codeblocks-13.12mingw-setup.exe
1
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 37
30.04.2014, 23:33  [ТС] 5
Цитата Сообщение от BlackSpace Посмотреть сообщение
Есди задать ключ для C++11.
а как задать ключ? (я про это в первый раз слышу)

C++
1
$ -std=c++11
так?и где это поместить?
0
205 / 181 / 112
Регистрация: 15.03.2014
Сообщений: 392
30.04.2014, 23:57 6
Острослав, Если Вы работаете в командной строке, то прямо в ней и прописываете.
Мой компилятор g++, а файл с исходным кодом называется reverse_list.cpp. Вот пример использования данного ключа.
Код
g++ -o reverse_list -std=c++11 reverse_list.cpp
А если в IDE какой-нибудь, то во многих есть специальные опции ( либо на текущий проект, либо на все проекты ) компилятора, где можно задать данный ключ.
Для Code::Blocks можно так:
Settings -> Compiller -> Global compiler settings -> Compiler settings -> Compiler flags -> галочка на пункте, в конце которого [-std=c++11]
В верхнем выпадающем списке должен быть выбран GNU GCC Compiler, если не используете другой компилятор, отличный от того, что идет в комплекте с данной IDE.
Скриншот прикрепил - тут опция для всех проектов.

В других IDE, с которыми мне приходилось работать опции компилятора выставляются похожим образом.
Миниатюры
Сортировка диапазона элементов в list (STL)  
1
205 / 181 / 112
Регистрация: 15.03.2014
Сообщений: 392
01.05.2014, 00:05 7
Поспешишь - людей насмешишь. В PrintList() не нужны std::, ведь уже есть нужное namespace.
1
01.05.2014, 00:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2014, 00:05
Помогаю со студенческими работами здесь

STL list. В изначально пустой список вставить 100 элементов путем вставки в случайную позицию
В изначально пустой список вставить 100 элементов путем вставки в случайную позицию. Случайная...

Работа с STL list + пропись List.h
Здравствуйте! Помогите, пожалуйста, разобраться с STL list. Нужно сделать программу в которой...

STL list
Доброго времени суток, пока имею поверхностное представление о алгоритмах STL и функциях для...

STL list
как вставить элемент в середину списка list STL? float list_insert_rand(int num) { srand...


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

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

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