Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
#1

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

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

Здравствуйте!
  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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2011, 18:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вопрос по TMemo и сортировке вектора списков. (C++):

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

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

Вопрос по сортировке - Pascal
Не могу разобраться в коде ПРОШУ откликнутся! -Для чего нужно было присваивать след. переменные: t:=x; x:=y; y:=t; ? -Какую роль играет...

Вопрос по сортировке - C++ Builder БД
Здраствйте. для начала спрошу такое: Какая замена в Builder функции сравнения: strstr(Edit1-&gt;Text,AnsiString(Cost.name)) А...

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

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

4
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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
Red Planet
49 / 10 / 2
Регистрация: 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();
у меня не работают. Ошибка на скриншоте.
0
Миниатюры
Вопрос по TMemo и сортировке вектора списков.  
Red Planet
49 / 10 / 2
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2011, 17:24
Привет! Вот еще темы с ответами:

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

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

Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора - Механика
Товарищи, помогите пожалуйста решить. Радиус-вектор материальной точки задается выражением: r=(t^2+2)i+(3t^2+4)j Найти...

Копирование данных двумерного массива состоящего из списков в список списков. - C#
Для нахождения МСТ (минимального остового дерева) написал функцию, которая принимает масив - гарф. private List&lt;Point&gt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru