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

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

Войти
Регистрация
Восстановить пароль
 
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
#1

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

09.11.2012, 11:49. Просмотров 351. Ответов 7
Метки нет (Все метки)

У меня к примеру есть массив
1 2 3 4 5 6
И нужно с него удалить все четные и освободить память занятую ненужными элементами.
Я делаю сортировку ,и по одному откидываю все четные в конец массива и освобождаю память которую они заняли.
1 3 5 2 4 6
Но такой метод забирает слишком много времени при большом количестве чисел в массиве.
Сказали что убрать элемент из массива можно намного быстрее , но если я просто уберу элемент мне все равно придется сдвигать массив на 1 влево?
Или есть какой-то выход?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2012, 11:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление эллементов с массива (C++):

Найти сумму четных эллементов матрицы, и сумму эллементов ниже главной диагонали - C++
Здравсвуйте,такая проблемка,нужно решить такую задачку, Дана матрица 4х4,найти сумму четных эллементов матрицы,и сумму эллементов ниже...

сложение эллементов массива - C++
помогите исправить задачу так, чтобы массив автоматически забивался #include<iostream.h> #include<math.h> void main() { int l,...

Не считает колличество эллементов - C++
#include <iostream.h> #include "stdafx.h" #include <stdio.h> #include <math.h> #include <conio.h> #include <stdlib.h> #include...

подсчитать количество эллементов - C++
#include "stdafx.h" # include <iostream> # include <conio.h> # include <Windows.h> using namespace std; int main () { ...

Удаление из одного массива элементов второго массива и запись результата в третий - C++
Есть массив masA (длина lenA), есть массив masB (длина lenB). Необходимо из массива masA удалить элементы, входящие в массив masB и...

Удалить из массива A[N] вс отрицательные элементы.Удаление отрицательных элементов массива оформить в виде функции - C++
Что исправить? #include <stdio.h> #define N 10 int udalenie(int A,int k ) { int i; for(i=k;i<N;i++)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
09.11.2012, 11:56 #2
нет. массив это по определению непрерывный кусок памяти. Используй связанные списки или стандартную библиотеку и вектора.
можно сделать выделение нового куска памяти с копированием туда нужного подмассива, но раз тебе сказали, что даже просто "откинуть элементы в конец массива - медленно", то перевыделение памяти тоже далеко не быстро в сравнении с этим будет.
0
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; 
}
Хотя все равно после каждого удаления происходит перераспределение памяти.
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 14:25 #4
Oberok, перераспределения памяти не будет. Будет просто копирование элементов вектора (для смещения влево)
0
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 безо всяких передвижений?
Или же единственный вариант через векторы?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
09.11.2012, 18:27 #6
Цитата Сообщение от maSt Посмотреть сообщение
а если задать массив указателями , возможно ли как-то удалить n-ный элемент массива ?
Легче задать связанный список и тогда действительно: будут тебе и указатели, будет тебе и удаление/вставка без особенных затрат.
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 18:27 #7
Собственно, есть списки, есть массивы. Они по-разному располагаются в памяти. Имеют свои плюсы и минусы.
У списков удаление идет без всякого бонусного копирования/перемещения. У массивов этого не избежать.
Поясните свои мысль про указатели.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
09.11.2012, 18:31 #8
Цитата Сообщение от maSt Посмотреть сообщение
Или же единственный вариант через векторы?
Как я уже сказал, есть вариант со связанными списками, векторы хороши тем, что всё сделано за нас, но удаление элемента из них всё равно происходит со сдвигом. Сама структура хранения вектора даёт быстрый доступ в произвольное место, но медленное удаление, и наоборот со списком.
Если уж юзать STL, то тогда используй <list>
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 18:31
Привет! Вот еще темы с ответами:

удаление элементов массива, совпадающих с элементами другого массива - C++
Здравствуйте, помогите найти ошибку в коде; суть задачи такая: удалить элементы из 1 массива, которые содержатся во 2 массиве. Как я...

Удаление элементов массива без буферного массива - C++
Требуется удалить элементы из массива, при это длинна массива уменьшится, ВАЖНО буферный массив не использовать! к примеру массив 12 23...

В одномерном массиве посчитать сумму эллементов после минимального - C++
Помогите срочно решить задачу на экзамене сижу!!! В одномерном массиве посчитать сумму эллементов после минимального

Удаление элемента из массива и сдвиг массива - C++
Нужно удалить максимальный элемент массива и сделать сдвиг массива на одну позицию. Нужно сделать без использования vector и динамических...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.11.2012, 18:31
Ответ Создать тему
Опции темы

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