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

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

Восстановить пароль Регистрация
 
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
31.08.2011, 18:49     Вопрос по TMemo и сортировке вектора списков. #1
Здравствуйте!
  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..."
    вообще игнорирует переходы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2011, 18:49     Вопрос по TMemo и сортировке вектора списков.
Посмотрите здесь:

Очередной вопрос по сортировке.. C++
Дан список, элементы которого являются координатами вектора. Найти длину вектора C++
Заданы три вектора a(n), b(m), c(k). Вывести наименование вектора, в котором максимальна сумма четных элементов, стоящих на нечетных местах C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А C++
Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.08.2011, 19:08     Вопрос по TMemo и сортировке вектора списков. #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';
    }
}
Сыроежка
Заблокирован
31.08.2011, 19:34     Вопрос по TMemo и сортировке вектора списков. #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 );
А с учетом этого написал бы функциональный объект, который принимает в качестве параметра конструктора номер элемента списка, по которому делать сравнение.
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
21.09.2011, 13:51  [ТС]     Вопрос по TMemo и сортировке вектора списков. #4
Все хорошо, только конструкции
C++
1
2
std::list<int>::iterator left = a.begin();
std::list<int>::iterator right = b.begin();
у меня не работают. Ошибка на скриншоте.
Миниатюры
Вопрос по TMemo и сортировке вектора списков.  
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
25.09.2011, 17:24  [ТС]     Вопрос по TMemo и сортировке вектора списков. #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;
}
Yandex
Объявления
25.09.2011, 17:24     Вопрос по TMemo и сортировке вектора списков.
Ответ Создать тему
Опции темы

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