Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
49 / 10 / 3
Регистрация: 20.09.2009
Сообщений: 263
1

Вопрос по TMemo и сортировке вектора списков.

31.08.2011, 18:49. Показов 600. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
  1. Есть вектор списков, нужно отсортировать по возрастанию первого элемента каждого списка вектора. Вот пример.
    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
    
    vector< list<int> > mVl (3, list<int>());
      mVl[0].push_back(20);
      mVl[0].push_back(7);
      mVl[0].push_back(17);
     
      mVl[1].push_back(1);
      mVl[1].push_back(12);
      mVl[1].push_back(34);
     
      mVl[2].push_back(13);
      mVl[2].push_back(12);
      mVl[2].push_back(34);
     
      for (int i = 0; i < mVl.size(); i++) {
        for (list<int>::iterator it = mVl[i].begin(); it != mVl[i].end(); ++it) {
          cout << *it << " ";
        }
      cout << endl;
      }
     
      for (int i = 1; i < mVl.size(); i++) {
        sort(mVl.begin(), mVl.end());
      }
     
        cout << endl;
     
      for (int i = 0; i < mVl.size(); i++) {
      for (list<int>::iterator it = mVl[i].begin(); it != mVl[i].end(); ++it) {
        cout << *it << " ";
      }
      cout << endl;
      }
    Сначала были списки (20, 7, 17), (1, 12, 34), (13, 12, 34).
    После сортировки (1, 12, 34), (13, 12, 34), (20, 7, 17).

    То есть стандартная сортировка работает здесь без дополнительного параметра. А если будет задача отсортировать по возрастанию второго, то как здесь сделать? Пробовал писать
    C++
    1
    2
    3
    
    bool mSort(int left, int right) {
      return left < right;
    }
    и применять
    C++
    1
    2
    3
    
    for (int i = 1; i < mVl.size(); i++) {
      sort(mVl.begin(), mVl.end(), mSort(mVl[i-1].front(), mVl[i].front()));
    }
    Не работает, говорит об ошибке "Call of non-function" и высылаем в algorithm на строки
    C++
    1
    2
    3
    4
    
    while (_First < _Pfirst
      && !_DEBUG_LT_PRED(_Pred, *(_Pfirst - 1), *_Pfirst)
      && !_Pred(*_Pfirst, *(_Pfirst - 1)))
      --_Pfirst;
  2. В поле Memo баг такой что-ли, что нельзя писать
    C++
    1
    
    MyMemo->Lines->Add("\n\n\n")
    И сколько угодно еще можно написать символов "\n", но переход будет только на одну строку. В это же время
    C++
    1
    2
    
    MyMemo->Lines->Add("\n");
    MyMemo->Lines->Add("\n");
    работает.

    А
    C++
    1
    
    MyMemo->Text = "\nLorem ipsum\ndolor sit amet..."
    вообще игнорирует переходы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2011, 18:49
Ответы с готовыми решениями:

Вопрос по сортировке
Не могу разобраться в коде ПРОШУ откликнутся! -Для чего нужно было присваивать след. переменные:...

вопрос по сортировке
Вот у меня есть класс студент. он составной. в нем 14 полей, но каждое поле - это тоже объект....

Вопрос по сортировке
Требуется решить задачу в общем виде для выборки следующего/предыдущего элемента списка. ...

Вопрос по сортировке
Здраствйте. для начала спрошу такое: Какая замена в Builder функции сравнения: ...

4
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
31.08.2011, 19:08 2
1.
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 <list>
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
 
bool comp(const std::list<int>& a, const std::list<int>& b)
{
    return *(++a.begin()) < *(++b.begin());
}
 
int main()
{
    std::vector< std::list<int> > mVl (3, std::list<int>());
    mVl[0].push_back(20);
    mVl[0].push_back(70);
    mVl[0].push_back(17);
  
    mVl[1].push_back(1);
    mVl[1].push_back(120);
    mVl[1].push_back(34);
 
    mVl[2].push_back(13);
    mVl[2].push_back(12);
    mVl[2].push_back(34);
 
    for (std::size_t i = 0; i < mVl.size(); i++) 
    {
    std::copy(mVl[i].begin(), mVl[i].end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
    }
 
    std::sort(mVl.begin(), mVl.end(), comp);
  
    std::cout << std::endl;
 
    for (std::size_t i = 0; i < mVl.size(); i++) 
    {
    std::copy(mVl[i].begin(), mVl[i].end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
    }
}
1
Заблокирован
31.08.2011, 19:34 3
Цитата Сообщение от Jupiter Посмотреть сообщение
1.
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 <list>
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
 
bool comp(const std::list<int>& a, const std::list<int>& b)
{
    return *(++a.begin()) < *(++b.begin());
}
 
int main()
{
    std::vector< std::list<int> > mVl (3, std::list<int>());
    mVl[0].push_back(20);
    mVl[0].push_back(70);
    mVl[0].push_back(17);
  
    mVl[1].push_back(1);
    mVl[1].push_back(120);
    mVl[1].push_back(34);
 
    mVl[2].push_back(13);
    mVl[2].push_back(12);
    mVl[2].push_back(34);
 
    for (std::size_t i = 0; i < mVl.size(); i++) 
    {
    std::copy(mVl[i].begin(), mVl[i].end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
    }
 
    std::sort(mVl.begin(), mVl.end(), comp);
  
    std::cout << std::endl;
 
    for (std::size_t i = 0; i < mVl.size(); i++) 
    {
    std::copy(mVl[i].begin(), mVl[i].end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
    }
}
Здесь все хорошо за исключением одного нюанса. А что если потребуется отсортировать вектор, по третьему элементу списка, или вообще по n-ому элементу списка. Поэтому я бы в вашей функции сравнения поменял бы выражение

C++
1
*(++a.begin())
на более сложную, но зато более перспективную конструкцию.


C++
1
2
3
4
5
6
std::list<int>::iterator left = a.begin();
std::list<int>::iterator right = b.begin();
std::advance( left, 1 );
std::advance( right, 1 );
 
return ( *left < *right );
А с учетом этого написал бы функциональный объект, который принимает в качестве параметра конструктора номер элемента списка, по которому делать сравнение.
1
49 / 10 / 3
Регистрация: 20.09.2009
Сообщений: 263
21.09.2011, 13:51  [ТС] 4
Все хорошо, только конструкции
C++
1
2
std::list<int>::iterator left = a.begin();
std::list<int>::iterator right = b.begin();
у меня не работают. Ошибка на скриншоте.
Миниатюры
Вопрос по TMemo и сортировке вектора списков.  
0
49 / 10 / 3
Регистрация: 20.09.2009
Сообщений: 263
25.09.2011, 17:24  [ТС] 5
Решение найдено.
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class SortByAny {
    int elemNumber;
    public: SortByAny(int);
            int getElemNumber() const { return elemNumber; }
            bool operator()(const list<int> &, const list<int> &);
};
 
bool hasEmpty(const vector< list<int> > &);
int listMinSize(const vector< list<int> > &);
 
// ---------------------------------------------------------------------------
int _tmain (int argc, _TCHAR* argv[]) {
    system ("title Temp");
 
    SortByAny s(6);
    vector< list<int> > v(4, list<int>());
    v[0].push_back(12);
    v[0].push_back(79);
    v[0].push_back(5);
    v[1].push_back(7);
    v[1].push_back(2);
    v[1].push_back(25);
    v[2].push_back(3);
    v[2].push_back(5);
    v[2].push_back(1);
    v[3].push_back(2);
    v[3].push_back(3);
    v[3].push_back(5);
    v[3].push_back(1);
    v[3].push_back(2);
 
    cout <<"Before sort." << endl;
    for (int i = 0; i < v.size(); i++) {
        for (list<int>::iterator it = v[i].begin(); it != v[i].end(); ++it)
            cout << *it << "\t";
        cout << endl;
    }
 
    if (s.getElemNumber() > listMinSize(v))
        s = SortByAny(listMinSize(v)-1);
 
    if (!hasEmpty(v)) {
        cout << endl << "Min. list size: " << listMinSize(v) << endl
        << "Coloumn sort by: " << s.getElemNumber() << endl
        << "After sort." << endl;
        sort(v.begin(), v.end(), s);
        for (int i = 0; i < v.size(); i++) {
            for (list<int>::iterator it = v[i].begin(); it != v[i].end(); ++it)
                cout << *it << "\t";
            cout << endl;
        } // for.
    } // if.
    else
        cout << "Error! There are empty lists in vector. Fill them. " << endl;
 
    system ("pause");
    return 0;
}
 
// ---------------------------------------------------------------------------
 
SortByAny::SortByAny(int newNumber) {
    if (newNumber >= 0)
        elemNumber = newNumber;
    else
        elemNumber = -newNumber;
}
 
bool SortByAny::operator ()(const list<int> &left, const list<int> &right) {
    list<int>::const_iterator lit = left.begin();
    list<int>::const_iterator rit = right.begin();
    if (left.size() == 0) return true;
    if (right.size() == 0) return false;
    for (int i = 0; i < elemNumber; i++) {
        lit++;
        rit++;
    }
    return *lit < *rit;
}
 
int listMinSize(const vector< list<int> > &vl) {
    int minSize = vl[0].size();
    for (int i = 1; i < vl.size(); i++)
        if (vl[i].size() < minSize)
            minSize = vl[i].size();
 
    return minSize;
}
 
bool hasEmpty(const vector< list<int> > &vl) {
    for (int i = 0; i < vl.size(); i++)
        if (vl[i].empty())
            return true;
    return false;
}
0
25.09.2011, 17:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2011, 17:24
Помогаю со студенческими работами здесь

Очередной вопрос по сортировке..
Ребят, помогите пожалуйста...всё никак не могу понять, как сортировать массив... Задача:...

Вопрос по сортировке массива
Уважаемые программисты, подскажите кто-то знает алгоритм сортировки методом причесывания?(возможно...

вопрос о сортировке пузырьком [C]
Приветствую всех. С недавнего времени занялся изучением С и программирования вцелом. В процессе...

Убрать из TMemo запятые, числа расположить в столбик, и вывести все это во второе поле TMemo
Привет всем вообщем помогите с программой ) у нас есть поле TMemo в котором числа расположены числа...

Передача вектора списков в функцию и взаимодействие с ним
Почему это не работает? #include &lt;fstream&gt; #include &lt;vector&gt; #include &lt;list&gt; using namespace...

Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора
Товарищи, помогите пожалуйста решить. Радиус-вектор материальной точки задается выражением:...


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

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