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

Удаление эллементов с массива - C++

Восстановить пароль Регистрация
 
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
09.11.2012, 11:49     Удаление эллементов с массива #1
У меня к примеру есть массив
1 2 3 4 5 6
И нужно с него удалить все четные и освободить память занятую ненужными элементами.
Я делаю сортировку ,и по одному откидываю все четные в конец массива и освобождаю память которую они заняли.
1 3 5 2 4 6
Но такой метод забирает слишком много времени при большом количестве чисел в массиве.
Сказали что убрать элемент из массива можно намного быстрее , но если я просто уберу элемент мне все равно придется сдвигать массив на 1 влево?
Или есть какой-то выход?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 11:56     Удаление эллементов с массива #2
нет. массив это по определению непрерывный кусок памяти. Используй связанные списки или стандартную библиотеку и вектора.
можно сделать выделение нового куска памяти с копированием туда нужного подмассива, но раз тебе сказали, что даже просто "откинуть элементы в конец массива - медленно", то перевыделение памяти тоже далеко не быстро в сравнении с этим будет.
Oberok
 Аватар для Oberok
5 / 5 / 0
Регистрация: 11.03.2011
Сообщений: 40
09.11.2012, 12:59     Удаление эллементов с массива #3
Может быть что-то вроде этого подойдет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
 
int main()
{
    int mass[10] = {1,1,2,2,3,4,5,10,15,13};
    vector<int> v(mass, mass + 10);
    
    
    for( int i = 0; i < v.size(); ++i)
    {  
       if(v[i] % 2 != 0)
       {
         v.erase(v.begin() + i);
         --i;
       }
    }     
    
    for( int j = 0; j < v.size(); ++j)
    {
      cout << v.at(j) << endl;   
    }  
      
   system("PAUSE");
   return 0; 
}
Хотя все равно после каждого удаления происходит перераспределение памяти.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 14:25     Удаление эллементов с массива #4
Oberok, перераспределения памяти не будет. Будет просто копирование элементов вектора (для смещения влево)
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
09.11.2012, 18:22  [ТС]     Удаление эллементов с массива #5
а если задать массив указателями , возможно ли как-то удалить n-ный элемент массива ?
То есть, к примеру имеем
1 2 3 4 5 6
Удаляем 2 и получаем
1 3 4 5 6 безо всяких передвижений?
Или же единственный вариант через векторы?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 18:27     Удаление эллементов с массива #6
Цитата Сообщение от maSt Посмотреть сообщение
а если задать массив указателями , возможно ли как-то удалить n-ный элемент массива ?
Легче задать связанный список и тогда действительно: будут тебе и указатели, будет тебе и удаление/вставка без особенных затрат.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 18:27     Удаление эллементов с массива #7
Собственно, есть списки, есть массивы. Они по-разному располагаются в памяти. Имеют свои плюсы и минусы.
У списков удаление идет без всякого бонусного копирования/перемещения. У массивов этого не избежать.
Поясните свои мысль про указатели.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 18:31     Удаление эллементов с массива
Еще ссылки по теме:

C++ удаление элементов массива без буферного массива
удаление элементов массива, совпадающих с элементами другого массива C++
C++ Удалить из массива A[N] вс отрицательные элементы.Удаление отрицательных элементов массива оформить в виде функции

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 18:31     Удаление эллементов с массива #8
Цитата Сообщение от maSt Посмотреть сообщение
Или же единственный вариант через векторы?
Как я уже сказал, есть вариант со связанными списками, векторы хороши тем, что всё сделано за нас, но удаление элемента из них всё равно происходит со сдвигом. Сама структура хранения вектора даёт быстрый доступ в произвольное место, но медленное удаление, и наоборот со списком.
Если уж юзать STL, то тогда используй <list>
Yandex
Объявления
09.11.2012, 18:31     Удаление эллементов с массива
Ответ Создать тему
Опции темы

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