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

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

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

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

31.08.2011, 18:49. Просмотров 373. Ответов 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..."
    вообще игнорирует переходы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2011, 18:49     Вопрос по TMemo и сортировке вектора списков.
Посмотрите здесь:

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

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

Если возможно, упорядочить булевы вектора, или вывести сообщение "Вектора несравнимы" - C++
помогите пожалуйста с задачей: Даны булева вектора a и b длины n. Если возможно, упорядочить их, или вывести сообщение &quot;Вектора...

Ошибка в сортировке - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; int const N = 5; using namespace std; class book{ ...

Ошибка в сортировке - C++
#include &lt;iostream&gt; using namespace std; int main() { int A, c; for (int i = 0; i &lt; 3; i++) { for (int j = 0; j &lt; 3;...

Помощь в сортировке - C++
Здравствуйте, товарищи программисты. Знаю, что вам уже всем надоело натыкаться на подобные темы со структурой ZNAK, но все же! Написал...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
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 и сортировке вектора списков.  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2011, 17:24     Вопрос по TMemo и сортировке вектора списков.
Еще ссылки по теме:

Ошибка в сортировке - C++
Часть программы я сделал, но сортировка массива выходит кривой, та строка, которая после сортировки должна быть первой, внезапно...

Счетчик в сортировке - C++
Помогите исправить ошибки: template &lt;class type&gt;float sortV(type *b,long n) { type a,i,j; float c; for (i=0;i&lt;n;i++) ...

Найти ошибку в сортировке - C++
Помогите найти ошибку в сортировке!! #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; class Organization { ...

Ошибка в порязрядной сортировке?! - C++
Вообщем дали задание отсортировать слова с помощью цифровой(поразрядной) сортировки,реализовал ее сам,вроде все компилиться,но не...


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

Или воспользуйтесь поиском по форуму:
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 и сортировке вектора списков.
Ответ Создать тему
Опции темы

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