С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

27.11.2012, 01:19. Просмотров 1639. Ответов 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 элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А - C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А на начало, а...

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

Сортировка вектора массива после удалание элемента - C++
дан массив векторов из 20 чисел; vectorArr = {0,1,2,3,4,5...}; удаляем методом vectorArr.erase(vectorArr.begin()+index); вопрос : как...

Сортировка элементов вектора - C++
Добрый вечер! Набросал наглядный пример, который вызывает ошибку компиляции. class My_Class { public: struct Item {...

Удаление, добавление, перестановка, сортировка элементов массива - C++
Постановка задачи: 1) Сформировать массив из n элементов с помощью датчика случайных чисел (n задается пользователем с клавиатуры). ...

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

30
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,634
27.11.2012, 03:31 #16
Цитата Сообщение от vechestva Посмотреть сообщение
Ну, раз надо так надо. Если бы голый нужен контейнер, я бы его применил, разве это НЕ ОЧЕВИДНО?

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

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

Как говорил один препод писалось правой нагй
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:45  [ТС] #21
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
void Add(int index, int element)
Какой смысл index тут если массив все равно сортируется ?

Как говорил один препод писалось правой нагй
C++
1
2
3
4
5
6
...
IntArray arr(4);
arr.Add(3, 3);
arr.Add(0, 0);
arr.Add(1, 1);
arr.Add(2, 2);
Допустим вот такой случай? Вот такой вот смысл.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,164
Записей в блоге: 17
27.11.2012, 03:47 #22
Ну так я вас не понимаю, о чем речь ? О доступе к элементу или добавлении новых элементов ?
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 03:50  [ТС] #23
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так я вас не понимаю, о чем речь ? О доступе к элементу или добавлении новых элементов ?
Добавление элементов в пределах выделенной памяти.
Для доступа там есть метод Get, если вы не видели.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,164
Записей в блоге: 17
27.11.2012, 03:54 #24
Добавление элементов в пределах выделенной памяти.
Ну вот а говорите не путаете людей...

Если память выделена, значит значение уже есть, добавлять нечего ( вопрос конечно чем они проинициализированны ).
А значит речь уже об доступе, изменении.
0
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 04:03  [ТС] #25
Цитата Сообщение от Avazart Посмотреть сообщение
Ну вот а говорите не путаете людей...

Если память выделена, значит значение уже есть, добавлять нечего ( вопрос конечно чем они проинициализированны ).
А значит речь уже об доступе, изменении.
Ну, от ваших постов мы к решению приблизились на целых 0%.
Что, хабрач что-ли закрыли, философ?
Вот такие они, гуманитарий программисты, на словах Бьерны Страуструпы, а на деле ... ну вы поняли.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,164
Записей в блоге: 17
27.11.2012, 04:06 #26
Ну, от ваших постов мы к решению приблизились на целых 0%.
Я пока и задачи внятно не расслышал... и не мы, а вы...
0
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 04:19 #27
Цитата Сообщение от vechestva Посмотреть сообщение
ps10n1ck, ну, а теперь попробуйте добавлять элементы по разным индексам?
а смысл в индексах, если потом массив сортируется?
получается так:
Вы выделяете память под 4 элемента, они инициализируются все 0.
Потом присваиваете 0-му элементу значение rand()%100 + 1 (пусть 17) и делаете сортировку - результат таков:
m_ints[0] = 0;
m_ints[1] = 0;
m_ints[2] = 0;
m_ints[3] = 17;
Потом присваиваете 1-му элементу значение rand()%100 + 1 (пусть 21) и делаете сортировку - результат таков:
m_ints[0] = 0;
m_ints[1] = 0;
m_ints[2] = 17;
m_ints[3] = 21;
Потом присваиваете 2-му элементу значение rand()%100 + 1 (пусть 10), тут вы перезаписываете значение 17 (которое ранее находилось по этому адресу) и делаете сортировку - результат таков:
m_ints[0] = 0;
m_ints[1] = 0;
m_ints[2] = 10;
m_ints[3] = 21;
Потом присваиваете 3-му элементу значение rand()%100 + 1 (пусть 55), тут вы перезаписываете значение 21 (которое ранее находилось по этому адресу) и делаете сортировку - результат таков:
m_ints[0] = 0;
m_ints[1] = 0;
m_ints[2] = 10;
m_ints[3] = 55;

вроде бы правильно объяснил причину появления нулей
1
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,164
Записей в блоге: 17
27.11.2012, 04:22 #28
Ну так это и тут видно Сортировка вектора, после добавление элементов.
Добавить элемент нельзя данным методом по тому как для этого нужно что-то затереть...
1
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 04:26 #29
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так это и тут видно Сортировка вектора, после добавление элементов.
Добавить элемент нельзя данным методом по тому как для этого нужно что-то затереть...
по всей видимости пропустил данный ответ =)
1
vechestva
-28 / 0 / 0
Регистрация: 14.09.2012
Сообщений: 47
27.11.2012, 06:39  [ТС] #30
ps10n1ck, ну это очевидно было. Но спасибо хоть постарался.
Мне нужно было найти другое решение. Про сортировку; иногда нужно менять методы сортировок.
Есть задача - нужно выполнить как задано. Даже если задача очевидно тупая. Преподов не устраивает ответ в виде :"зачем изобретать, когда есть уже велосипеды в виде контейнеров".
Вот так вот, наш гуманитарий Avazart.

Не по теме:

P.S: препод не мой, я уже давно не студент.

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

Найти сколько элементов первого вектора совпадают с элементами второго вектора - C++
#include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;vector&gt; #include &lt;set&gt; using namespace std; void main() { ...

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

Сортировка вектора по полю(Сортировка вставками) - C++
Здравствуйте! Нужно написать сортировку вектора по полю weight класса tomato. Вот класс: #pragma once #include &lt;iostream&gt; ...

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


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

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

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