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

Сортировка вектора, после добавление элементов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.58
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 01:19     Сортировка вектора, после добавление элементов #1
Доброго.
Есть класс массив. После каждого добавления элемента он должен сортировать элементы по возрастанию.
Вот упрощенный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class IntArray
{
public:
    IntArray() {}
    IntArray(int size) { m_ints.resize(size); }
    
    void Add(int index, int element)
    {
        m_ints[index] = element;
        sort(m_ints.begin(), m_ints.end());
    }
    int GetElement(int index) const { return m_ints.at(index); }
    
private:
    vector<int> m_ints;
};
но на деле всё совсем не так, всё из-за выделение памяти методом resize().
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
   const char arrSize = 4;
   IntArray arr(arrSize);
   for(char i = 0; i < arrSize; ++i)
       arr.Add(i, rand()%100 + 1);
   for(char i = 0; i < arrSize; ++i)
       cout << arr.Get(i) << endl;
 
   cin.get();
}
на выводе какие то не понятные нули, вместо элементов.
Как решить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 01:19     Сортировка вектора, после добавление элементов
Посмотрите здесь:

C++ Сортировка элементов вектора
C++ ЕХЕ файл после ввода элементов вектора прекращает работу
Сортировка вектора массива после удалание элемента C++
Удаление, добавление, перестановка, сортировка элементов массива C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 02:29     Сортировка вектора, после добавление элементов #2
хм... сам ломал, голову и не могу понять..
если сделать отдельно метод сорт в классе
C++
1
void Sort(){std::sort(m_ints.begin(), m_ints.end());}
а потом после добавления элементов вызывать
C++
1
arr.Sort();
то сортировка работает нормально

еще как вариант указать сортировку:
C++
1
2
3
4
5
void Add(int index, int element)
    {
        m_ints[index] = element;
        sort(m_ints.begin(), m_ints.end(), std::greater<int>());
    }
то сортировка по убыванию работает нормально, а вот по возрастанию не хочет сортировать... по всей видимости в реализации std::less<int>() что-то такое, чего я не знаю...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
27.11.2012, 02:45     Сортировка вектора, после добавление элементов #3
Есть класс массив. После каждого добавления элемента он должен сортировать элементы по возрастанию.
Мб имеет смысл использовать готовое решение в виде отсортированного ассоциативного контейнера, такого, как std::set, к примеру?

Добавлено через 2 минуты
C++
1
const char arrSize = 4;
С каких пор размер char-ом меряют? Возможно, int тут был бы уместнее?

Добавлено через 1 минуту
C++
1
m_ints[index] = element;
Толку от вектора? У него push_back есть для записи в конец.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
27.11.2012, 02:50     Сортировка вектора, после добавление элементов #4
Тут похоже вот чего :
перераспределение памяти есть ,а место не резервировано .
C++
1
  m_ints.reserve(100); // Резервируем место
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:06  [ТС]     Сортировка вектора, после добавление элементов #5
Цитата Сообщение от MrGluck Посмотреть сообщение
Мб имеет смысл использовать готовое решение в виде отсортированного ассоциативного контейнера, такого, как std::set, к примеру?
Ну, раз надо так надо. Если бы голый нужен контейнер, я бы его применил, разве это НЕ ОЧЕВИДНО?
Цитата Сообщение от MrGluck Посмотреть сообщение
Добавлено через 2 минуты

C++
1
const char arrSize = 4;
С каких пор размер char-ом меряют? Возможно, int тут был бы уместнее?
Ну потому что так логично.
Цитата Сообщение от MrGluck Посмотреть сообщение
Добавлено через 1 минуту

Толку от вектора? У него push_back есть для записи в конец.
Ну, раз надо так надо.
Умник нашёлся.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.11.2012, 03:09     Сортировка вектора, после добавление элементов #6
Да че тут не понятного ?
C++
1
void Add(int index, int element)
Не соответствует названию, он не добавляет элементы, а обеспечивает ли доступ к уже существующим аналогично оператору [].
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:11  [ТС]     Сортировка вектора, после добавление элементов #7
Цитата Сообщение от Avazart Посмотреть сообщение
Да че тут не понятного ?
C++
1
void Add(int index, int element)
Не соответствует названию, он не добавляет элементы, а обеспечивает ли доступ к уже существующим аналогично оператору [].
да, название методу не правильное дал. Нужно было At назвать, но сути не меняет.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.11.2012, 03:12     Сортировка вектора, после добавление элементов #8
C++
1
const char arrSize = 4;
Это вообще тяжелый случай ...

Добавлено через 48 секунд
да, название методу не правильное дал. Нужно было At назвать, но сути не меняет.
Ну так.. мы не телепаты...
Да и в названии темы
Сортировка вектора, после добавление элементов

И на at() он не тянет, проверки границ нет.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 03:13     Сортировка вектора, после добавление элементов #9
еще странный результат будет, если изначально в конструкторе инициализировать m_ints таким образом, что все значения заполняются изначально числом, которое заведомо больше того, что будет выдано при рандоме:
C++
1
IntArray(int size): m_ints(size, 9999) {};
тогда сортировка пройдет нормально
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.11.2012, 03:14     Сортировка вектора, после добавление элементов #10
ps10n1ck, Да тут ничЁ странного нет, что делали то и получили...
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:16  [ТС]     Сортировка вектора, после добавление элементов #11
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
const char arrSize = 4;
Это вообще тяжелый случай ...
почему вы к нему цепляетесь? Диапазон char не позволяет записать число 4?
Он не только для символов предназначен, или НЕТ?

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
ps10n1ck, Да тут ничЁ странного нет, что делали то и получили...
o-realy?
Цитата Сообщение от vechestva Посмотреть сообщение
Вот упрощенный пример:
тему не читаем?
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.11.2012, 03:22     Сортировка вектора, после добавление элементов #12
тогда сортировка пройдет нормально
Это если числа будут < 99999

Добавлено через 1 минуту
Цитата Сообщение от vechestva Посмотреть сообщение
почему вы к нему цепляетесь? Диапазон char не позволяет записать число 4?
Он не только для символов предназначен, или НЕТ?
Вообще то для символов, на то он и character

Путать людей не нужно... они просто не будут читать ваш код.

Добавлено через 3 минуты
Цитата Сообщение от vechestva Посмотреть сообщение
o-realy?
Конечно...
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:22  [ТС]     Сортировка вектора, после добавление элементов #13
Цитата Сообщение от Avazart Посмотреть сообщение
Вообще то для символов, на то он и character
ну это вообще анекдот.
Цитата Сообщение от Avazart Посмотреть сообщение
Путать людей не нужно... они просто не будут читать ваш код.
Мне кажется тут путаетесь только вы.
Я показываю всё очевидно и упрощённо.

--
Так, по делу, сейчас кое что попробую и отпишусь.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 03:24     Сортировка вектора, после добавление элементов #14
Цитата Сообщение от Avazart Посмотреть сообщение
Это если числа будут < 99999
хорошо, тогда почему нет сортировки, при таком варианте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
IntArray(int size): m_ints(size, 0) {};
 
void Add(int element)
    {
    m_ints.push_back(element);
    sort(m_ints.begin(), m_ints.end());
    }
 
.......
 
for(int i = 0; i < arrSize; ++i){
       arr.Add(rand()%100 + 1);
}
в данном случае все элементы так и останутся 0,
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.11.2012, 03:27     Сортировка вектора, после добавление элементов #15
хорошо, тогда почему нет сортировки, при таком варианте:
Сортировка есть просто нули в начале всегда,вводимые значения в конце, попробуйте вводить отрицательные значения
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
27.11.2012, 03:31     Сортировка вектора, после добавление элементов #16
Цитата Сообщение от vechestva Посмотреть сообщение
Ну, раз надо так надо. Если бы голый нужен контейнер, я бы его применил, разве это НЕ ОЧЕВИДНО?

Ну потому что так логично.

Ну, раз надо так надо.
Умник нашёлся.
Вы знаете, для меня очевидно ваше задание, тем не менее, я не пишу диагнозы относительно ваших умственных способностей. Попрошу с уважением относиться к людям с форума. Это ваша задача, никто вам ничего не обязан.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.11.2012, 03:33     Сортировка вектора, после добавление элементов #17
Ну так что мешает смотреть что происходит ?
C++
1
2
3
4
5
6
7
8
9
    void Add(int index, int element)
        {
                std::cout<<"Вставляем "<<index<<" значение "<<element<<std::endl;
                m_ints[index] = element;
                sort(m_ints.begin(), m_ints.end());
                std::cout<<"Теперь у нас массив"<<std::endl;
                std::copy(m_ints.begin(),m_ints.end(),std::ostream_iterator<int>(std::cout,"\t") ) ;
                std::cout<<std::endl;
        }

Код
Текущая кодовая страница: 1251
Вставляем 0 значение 31
Теперь у нас массив
0       0       0       31
Вставляем 1 значение 83
Теперь у нас массив
0       0       31      83
Вставляем 2 значение 91
Теперь у нас массив
0       0       83      91
Вставляем 3 значение 57
Теперь у нас массив
0       0       57      83
Для продолжения нажмите любую клавишу . . .
Все очевидно и просто ...
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 03:35     Сортировка вектора, после добавление элементов #18
Цитата Сообщение от Avazart Посмотреть сообщение
Сортировка есть просто нули в начале всегда,вводимые значения в конце, попробуйте вводить отрицательные значения
блин, я протупил с push_back
вот рабочий вариант будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
IntArray() {};
 
        void Add(int element)
    {
            m_ints.push_back(element);
            sort(m_ints.begin(), m_ints.end());
    }
 
..................
 
IntArray arr;
for(char i = 0; i < arrSize; ++i)
  arr.Add(rand()%100 + 1);
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:40  [ТС]     Сортировка вектора, после добавление элементов #19
ps10n1ck, ну, а теперь попробуйте добавлять элементы по разным индексам?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 03:41     Сортировка вектора, после добавление элементов
Еще ссылки по теме:

Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) C++
C++ После добавления элементов в список сортировка зависает

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.11.2012, 03:41     Сортировка вектора, после добавление элементов #20
C++
1
void Add(int index, int element)
Какой смысл index тут если массив все равно сортируется ?

Как говорил один препод писалось правой нагй
Yandex
Объявления
27.11.2012, 03:41     Сортировка вектора, после добавление элементов
Ответ Создать тему
Опции темы

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