Автор Тема: Сортировка списка указателей.  (Прочитано 3280 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Сортировка списка указателей.
« : 13 Июля 2014, 14:00:12 »
В свободное от жульничества время (по вечерам), балуюсь программированием, пытаюсь восстановить былые знания. Возникала проблема, как отсортировать список list указателей на целочисленное. Гугель ничего путного не ответил. Проблема именно с указателями, простые переменные сортируются без проблем. Если быть уж совсем точным, то проблема с функцией int comp_ints( const void* a, const void* b ), точнее как туда передать указатели? Может еще остались у нас в городе программисты на С++, которые знают, как решить эту проблему?

Код такой:

#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

int comp_ints( const void* a, const void* b )
{
     int *arg1 = (int*) a;
     int *arg2 = (int*) b;
     if( *arg1 < *arg2 ) return -1;
     else if( *arg1 == *arg2 ) return 0;
     else return 1;
}
 
int main()
{
    list<int*> v1;
   
    int a = 0;
    int b = 1;
    int c = 9;
    int d = 1;
    int e = 3;
    int f = 4;
    int g = 3;
    int h = 2;
    int i = 5;
   
    int *j = &a;
    int *k = &b;
    int *l = &c;
    int *m = &d;
    int *n = &e;
    int *o = &f;
    int *p = &g;
    int *q = &h;
    int *r = &i;
   
    v1.push_back(j);
    v1.push_back(k);
    v1.push_back(l);
    v1.push_back(m);
    v1.push_back(n);
    v1.push_back(o);
    v1.push_back(p);
    v1.push_back(q);
    v1.push_back(r);
   
    cout << "У нас есть список v1 из " << v1.size() << " элементов \n";
       
    list<int*>::iterator i1;
    for(i1 = v1.begin(); i1 != v1.end(); ++i1)
    {
//++i;  //<< v1.at(i)
cout << "Элемент "  << " = " << **i1 << "\n";
}
   
    cout << "Сортируем наш список \n";
   
    //sort(v1.begin(), v1.end()); //Если вектор
    v1.sort(comp_ints); // Если лист
   
    cout << "Список после сортировки \n";
   
    for(i1 = v1.begin(); i1 != v1.end(); ++i1)
    {
cout << "Элемент "  << " = " << **i1 << "\n";
    }
   
    return 0;
}

Захожу сюда редко.

Оффлайн android

  • Авторитет
Re: Сортировка списка указателей.
« Ответ #1 : 13 Июля 2014, 15:21:22 »
Функция вроде результат сравнения должна возращать true/false, нет?  ???

bool comp_ints( const int* a, const int* b )
{
return ( *a < *b ) ;
}

 :D
« Последнее редактирование: 13 Июля 2014, 15:35:53 от android »

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #2 : 13 Июля 2014, 15:33:25 »
Функция вроде результат сравнения должна возращать true/false, нет?  ???

bool comp_ints( const int* a, const int* b )
{
if( *a < *b ) return true;
return false;
}

Да, функция должна возвращать или true или false, но проблема в том, что в эту функцию нужно передать указатель на указатель.
Захожу сюда редко.

Оффлайн DoReMi

  • Админы
  • *****
  • Пол: Мужской
    • БЛОГОДОРЕМИЕ
Re: Сортировка списка указателей.
« Ответ #3 : 13 Июля 2014, 15:55:23 »
Благодарю тебя, Господи, что я не сишник.
Вы держитесь здесь,  вам всего доброго, хорошего настроения, здоровья. ©

Оффлайн android

  • Авторитет
Re: Сортировка списка указателей.
« Ответ #4 : 13 Июля 2014, 16:01:07 »
Да, функция должна возвращать или true или false, но проблема в том, что в эту функцию нужно передать указатель на указатель.

Так к ней указатели и приходят. Твой пример то нормально работает. Чего ещё нужно то?  ???

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #5 : 13 Июля 2014, 16:05:33 »
Да, функция должна возвращать или true или false, но проблема в том, что в эту функцию нужно передать указатель на указатель.

Так к ней указатели и приходят. Твой пример то нормально работает. Чего ещё нужно то?  ???

Указатель и указатель НА указатель это разные вещи ))) мой пример не сортирует список :(
Захожу сюда редко.

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #6 : 13 Июля 2014, 16:06:07 »
Благодарю тебя, Господи, что я не сишник.

Та это проблема не С++, это просто я такой сишник.
Захожу сюда редко.

Оффлайн android

  • Авторитет
Re: Сортировка списка указателей.
« Ответ #7 : 13 Июля 2014, 16:11:25 »
Да, функция должна возвращать или true или false, но проблема в том, что в эту функцию нужно передать указатель на указатель.

Так к ней указатели и приходят. Твой пример то нормально работает. Чего ещё нужно то?  ???

Указатель и указатель НА указатель это разные вещи ))) мой пример не сортирует список :(

Как же не сортирует? Сортирует, сам проверял.

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #8 : 13 Июля 2014, 16:25:14 »

Как же не сортирует? Сортирует, сам проверял.

Не, программа выдает:
Список после сортировки
Элемент  = 5
Элемент  = 2
Элемент  = 3
Элемент  = 4
Элемент  = 3
Элемент  = 1
Элемент  = 1
Элемент  = 9
Элемент  = 0

А мне нужно:

Список после сортировки
Элемент  = 0
Элемент  = 1
Элемент  = 1
Элемент  = 2
Элемент  = 3
Элемент  = 3
Элемент  = 4
Элемент  = 5
Элемент  = 9

Захожу сюда редко.

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #9 : 13 Июля 2014, 16:27:12 »
Я просто не пойму как работать с указателями в stl;
Захожу сюда редко.

Оффлайн android

  • Авторитет
Re: Сортировка списка указателей.
« Ответ #10 : 13 Июля 2014, 16:44:35 »

Как же не сортирует? Сортирует, сам проверял.
Не, программа выдает:



а функцию сравнения ты поправил?

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #11 : 13 Июля 2014, 16:49:53 »
На самом деле проблема еще шире чем. Мне нужно узнать есть ли в списке(векторе) дубликаты, т.е. одинаковые элементы. Для этого походит функция  из stl  - adjacent_find но она выдает результат, только если повторяющиеся элементы находятся рядом в списке или векторе, а для этого вектор/список нужно отсортировать. Обычный вектор/список легко сортируется и гугель легко находит миллион таких примеров. Но у меня вектор/список указателей. Вот тут проблемы и начинаются.

Другой способ найти повторяющиеся цифры в списке/векторе, это пройти итератором со вложенным циклом for.
Я так и сделал. Слепил функцию которая должны возвращать true если дубликаты есть и false если нет.

Код этой функции такой:

Цитировать
bool CheckDuplicate(list<int*> l_list)
{
   
   list<int*>::iterator i1;
    for(i1 = l_list.begin(); i1 != l_list.end(); ++i1)
    {
      list<int*>::iterator i2;
      for(i2 = l_list.begin(); i2 != l_list.end(); ++i2)
      {
         if (**i1 == **i2)
            return true;   
      }   
   }

   return false;
}

Но дело в том, что эта функции все время возвращает true, потому, что во внутреннем цикле сравнивается первый элемент списка с с самим собой. Что бы этого избежать, в простых списках/векторах, просто добавляется +1 к i2 = l_list.begin() т.е. i2 = l_list.begin() + 1; Но у меня как я уже сказал список не простой, а список указателей. И тут я опять не пойму как мне сдвинуть во внутреннем цикле первую итерацию на одно число. Опять указатель жизнь портит.
Захожу сюда редко.

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #12 : 13 Июля 2014, 16:51:43 »
а функцию сравнения ты поправил?

нет. В функции сравнения, мне нужно только разобраться с указателями, сам функция это стандартная qsort, там ничего править не нужно, в простом векторе без указателей она работает нормально.
Захожу сюда редко.

Оффлайн android

  • Авторитет
Re: Сортировка списка указателей.
« Ответ #13 : 13 Июля 2014, 16:59:22 »
а функцию сравнения ты поправил?

нет. В функции сравнения, мне нужно только разобраться с указателями, сам функция это стандартная qsort, там ничего править не нужно, в простом векторе без указателей она работает нормально.
Я про твою функцию сравнения (comp_ints( const void* a, const void* b )) говорю, а не сортировку, из-за неё пример работает неправильно.

Оффлайн Film

  • Постоянный читатель
  • Пол: Мужской
Re: Сортировка списка указателей.
« Ответ #14 : 13 Июля 2014, 23:09:47 »
Я про твою функцию сравнения (comp_ints( const void* a, const void* b )) говорю, а не сортировку, из-за неё пример работает неправильно.

А, понял, поправил, спасибо. Заработала ))
Захожу сюда редко.