Удалить все элементы из массива больше n

Я новичок в программировании. Что-то мешает мне кодировать. Предположим, у меня есть массив.

int Array[] = {3,6,9,5,10,21,3,25,14,12,32,41,3,24,15,26,7,8,11,4};

Я хочу удалить все элементы больше 9. Как мне это сделать?


person Xrin    schedule 17.12.2014    source источник
comment
Вы не можете удалять элементы из массива. Лучшее, что вы можете сделать, это установить для них какое-то особое значение.   -  person juanchopanza    schedule 17.12.2014
comment
У вас проблемы с кодированием, потому что невозможно удалить элементы из массива.   -  person PaulMcKenzie    schedule 17.12.2014
comment
возможный дубликат Удалить элемент из массива C++   -  person trejder    schedule 17.12.2014
comment
@trejder, спасибо. Но я хочу удалить элемент в состоянии   -  person Xrin    schedule 17.12.2014


Ответы (3)


Вы можете сделать это, если используете вектор. Сначала инициализируйте вектор своим массивом. Затем используйте функцию remove_if(). Надеюсь, это поможет.

#include <algorithm>
#include <vector>

int main()
{
int Array[] = {3,6,9,5,10,21,3,25,14,12,32,41,3,24,15,26,7,8,11,4};

vector<int> V(Array, Array+20);
vector<int> :: iterator it;

it = remove_if(V.begin(), V.end(), bind2nd(greater<int>(), 9));


V.erase (it, V.end());  // This is your required vector if you wish to use vector

}
person Shahriar    schedule 17.12.2014
comment
Если невозможно удалить элемент из массива, я попытаюсь использовать это. Спасибо. - person Xrin; 17.12.2014
comment
Почему int K? В этом нет необходимости. V.erase(it, V.end()); - person PaulMcKenzie; 17.12.2014
comment
@PaulMcKenzie, о.. спасибо. - person Shahriar; 17.12.2014

Вы не можете удалить элементы из массива, так как они имеют фиксированный размер.

Если бы вы использовали std::vector, то решение выглядело бы так:

  #include <vector>
  #include <algorithm>
  #include <iostream>
  #include <iterator>

  using namespace std;

  int main()
  {
     std::vector<int> Array = {3,6,9,5,10,21,3,25,14,12,32,41,3,24,15,26,7,8,11,4};

     Array.erase(remove_if(Array.begin(), Array.end(), [](int n) { return n > 9; }),
                 Array.end());
     copy(Array.begin(), Array.end(), ostream_iterator<int>(cout, " "));

  }

Живой пример: http://ideone.com/UjdJ5h

Если вы хотите придерживаться своего массива, но отметить элементы, которые больше 10, вы можете использовать тот же алгоритм std::remove_if.

  #include <algorithm>
  #include <iostream>
  #include <iterator>

  using namespace std;

  int main()
  {
     int Array[] = {3,6,9,5,10,21,3,25,14,12,32,41,3,24,15,26,7,8,11,4};
     int *overwrite_start = remove_if(std::begin(Array), std::end(Array), [](int n){ return n>9; });
     fill(overwrite_start, std::end(Array), -1);
     copy(std::begin(Array), std::end(Array), ostream_iterator<int>(cout, " "));
  }

Приведенное выше переместит «стертые» элементы в конец массива и пометит их -1.

Живой пример: http://ideone.com/7rwaXy

Обратите внимание на использование в обоих примерах функций алгоритма STL. Во втором примере с массивом используется та же функция алгоритма remove_if. remove_if возвращает начало «стертых» данных, поскольку remove_if на самом деле не удаляет, а перемещает данные в конец последовательности.

person PaulMcKenzie    schedule 17.12.2014
comment
с С++ 11 вы можете использовать std::end(Array) вместо Array + aSize (чтобы избежать подверженного ошибкам sizeof). - person Jarod42; 17.12.2014
comment
И чтобы быть симметричным, вы также можете использовать std::begin(). - person Jarod42; 17.12.2014

я пытаюсь поменять концепцию без использования вектора

int Array[] = {3,6,9,5,10,21,3,25,14,12,32,41,3,24,15,26,7,8,11,4};
int n;
int arr_len = sizeof(Array)/sizeof(int);
void print_array_value() {
int i;
cout << "\n";
for (i = 0; i < arr_len; i++) {
    cout << Array[i] << ", ";
}
cout << " : " << arr_len << "\n";
}
void swap_array_value(int start) {
int i;
for ( ; (start+1) < arr_len; start++) {
    Array[start] = Array[start+1];
}
}
void remove_array_value() {
int i;
for (i = 0; i < arr_len; i++) {
    if (Array[i] > n) {
        swap_array_value(i);
        arr_len--;
        i--;
    }
}
}
void main () {
clrscr();
cout << "Enter the N value : ";
cin >> n;
print_array_value();
remove_array_value();
print_array_value();
cout << "Array Length : " << arr_len;
getch();
}
person Kavin    schedule 17.12.2014