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

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

27.11.2012, 01:19. Просмотров 1800. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

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Эксперт С++
8086 / 4939 / 1431
Регистрация: 29.11.2010
Сообщений: 13,395
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
861 / 759 / 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
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 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
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 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
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 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
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 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
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
27.11.2012, 03:27 15
хорошо, тогда почему нет сортировки, при таком варианте:
Сортировка есть просто нули в начале всегда,вводимые значения в конце, попробуйте вводить отрицательные значения
0
MrGluck
Модератор
Эксперт CЭксперт С++
8086 / 4939 / 1431
Регистрация: 29.11.2010
Сообщений: 13,395
27.11.2012, 03:31 16
Цитата Сообщение от vechestva Посмотреть сообщение
Ну, раз надо так надо. Если бы голый нужен контейнер, я бы его применил, разве это НЕ ОЧЕВИДНО?

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

Ну, раз надо так надо.
Умник нашёлся.
Вы знаете, для меня очевидно ваше задание, тем не менее, я не пишу диагнозы относительно ваших умственных способностей. Попрошу с уважением относиться к людям с форума. Это ваша задача, никто вам ничего не обязан.
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 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
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 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

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

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

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


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

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

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