Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.58
vechestva
-28 / 0 / 1
Регистрация: 14.09.2012
Сообщений: 47
#1

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

27.11.2012, 01:19. Просмотров 1774. Ответов 30
Метки нет (Все метки)

Доброго.
Есть класс массив. После каждого добавления элемента он должен сортировать элементы по возрастанию.
Вот упрощенный пример:
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();
}
на выводе какие то не понятные нули, вместо элементов.
Как решить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 01:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сортировка вектора, после добавление элементов (C++):

Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора,...

Добавление и исключение элементов вектора
Задача Люди стоят в очереди, но никогда не уходят из её начала, зато могут...

Сортировка вектора массива после удалание элемента
дан массив векторов из 20 чисел; vectorArr = {0,1,2,3,4,5...}; удаляем методом...

Сортировка элементов вектора
Добрый вечер! Набросал наглядный пример, который вызывает ошибку компиляции. ...

Удаление, добавление, перестановка, сортировка элементов массива
Постановка задачи: 1) Сформировать массив из n элементов с помощью датчика...

ЕХЕ файл после ввода элементов вектора прекращает работу
Вот такой код, вычисление евклидовой нормы вектора 2 способами(опыт...

30
ps10n1ck
54 / 48 / 11
Регистрация: 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>() что-то такое, чего я не знаю...
1
MrGluck
Модератор
Эксперт CЭксперт С++
7980 / 4861 / 1422
Регистрация: 29.11.2010
Сообщений: 13,234
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 есть для записи в конец.
0
MrCold
859 / 757 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
27.11.2012, 02:50 #4
Тут похоже вот чего :
перераспределение памяти есть ,а место не резервировано .
C++
1
  m_ints.reserve(100); // Резервируем место
1
vechestva
-28 / 0 / 1
Регистрация: 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 есть для записи в конец.
Ну, раз надо так надо.
Умник нашёлся.
0
Avazart
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
27.11.2012, 03:09 #6
Да че тут не понятного ?
C++
1
void Add(int index, int element)
Не соответствует названию, он не добавляет элементы, а обеспечивает ли доступ к уже существующим аналогично оператору [].
0
vechestva
-28 / 0 / 1
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:11  [ТС] #7
Цитата Сообщение от Avazart Посмотреть сообщение
Да че тут не понятного ?
C++
1
void Add(int index, int element)
Не соответствует названию, он не добавляет элементы, а обеспечивает ли доступ к уже существующим аналогично оператору [].
да, название методу не правильное дал. Нужно было At назвать, но сути не меняет.
0
Avazart
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
27.11.2012, 03:12 #8
C++
1
const char arrSize = 4;
Это вообще тяжелый случай ...

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

И на at() он не тянет, проверки границ нет.
0
ps10n1ck
54 / 48 / 11
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 03:13 #9
еще странный результат будет, если изначально в конструкторе инициализировать m_ints таким образом, что все значения заполняются изначально числом, которое заведомо больше того, что будет выдано при рандоме:
C++
1
IntArray(int size): m_ints(size, 9999) {};
тогда сортировка пройдет нормально
0
Avazart
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
27.11.2012, 03:14 #10
ps10n1ck, Да тут ничЁ странного нет, что делали то и получили...
0
vechestva
-28 / 0 / 1
Регистрация: 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 Посмотреть сообщение
Вот упрощенный пример:
тему не читаем?
0
Avazart
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
27.11.2012, 03:22 #12
тогда сортировка пройдет нормально
Это если числа будут < 99999

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

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

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

--
Так, по делу, сейчас кое что попробую и отпишусь.
0
ps10n1ck
54 / 48 / 11
Регистрация: 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,
0
Avazart
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
27.11.2012, 03:27 #15
хорошо, тогда почему нет сортировки, при таком варианте:
Сортировка есть просто нули в начале всегда,вводимые значения в конце, попробуйте вводить отрицательные значения
0
MrGluck
Модератор
Эксперт CЭксперт С++
7980 / 4861 / 1422
Регистрация: 29.11.2010
Сообщений: 13,234
27.11.2012, 03:31 #16
Цитата Сообщение от vechestva Посмотреть сообщение
Ну, раз надо так надо. Если бы голый нужен контейнер, я бы его применил, разве это НЕ ОЧЕВИДНО?

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

Ну, раз надо так надо.
Умник нашёлся.
Вы знаете, для меня очевидно ваше задание, тем не менее, я не пишу диагнозы относительно ваших умственных способностей. Попрошу с уважением относиться к людям с форума. Это ваша задача, никто вам ничего не обязан.
0
Avazart
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 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
Для продолжения нажмите любую клавишу . . .
Все очевидно и просто ...
0
ps10n1ck
54 / 48 / 11
Регистрация: 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);
0
vechestva
-28 / 0 / 1
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:40  [ТС] #19
ps10n1ck, ну, а теперь попробуйте добавлять элементы по разным индексам?
0
Avazart
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
27.11.2012, 03:41 #20
C++
1
void Add(int index, int element)
Какой смысл index тут если массив все равно сортируется ?

Как говорил один препод писалось правой нагй
0
27.11.2012, 03:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 03:41
Привет! Вот еще темы с решениями:

Найти сколько элементов первого вектора совпадают с элементами второго вектора
#include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;vector&gt; #include &lt;set&gt;...

После добавления элементов в список сортировка зависает
Добрый день, поправьте пожалуйста сортировку, после добавления элементов в...

Сортировка вектора по полю(Сортировка вставками)
Здравствуйте! Нужно написать сортировку вектора по полю weight класса tomato....

Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5)
Ребята помогите пожалуйста с задачкой. Я сам не шарю в C++, но в этом семестре...


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

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

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