C++ объявляет индекс массива как пустой

У меня есть массив, в котором я должен игнорировать, удалить все числа, которые repetitive,

например 1 2 4 3 3 0 1 2 0

Что я сделал, я проверил номера и попробовал такие вещи, как \0 а также NULL но оба они дают значение 0, так что это не решение. Так есть ли способ сделать индекс пустым или просто игнорировать его? Числа должны быть случайными, поэтому я не могу объявить что-то вроде

array[i]=123;
if(array[i]==123) dont_print_out();

2 ответа

Решение

Если ваш массив представляет собой обычный массив C++, у вас нет способа "удалить" элементы. Единственное решение - сдвинуть оставшиеся элементы влево.

Если ваш массив std::vector, вы можете использовать erase функция. Однако из-за структуры базовых данных в векторе вы делаете то же самое, что и раньше: это неэффективно.

Если вы хотите эффективно удалять элементы, случайно расположенные в вашей последовательности, рассмотрите возможность использования другого типа контейнера, например std::list,

Наконец, чтобы достичь своей цели, взгляните на std::set или же std::unordered_set, Эти контейнеры обеспечивают уникальность ваших товаров.

  1. Используйте std::vector вместо массива, так что вы можете стереть элементы 1.
  2. Если вам не нужно поддерживать исходный порядок, возможно, его проще всего отсортировать, а затем используйте std::unique устранить дубликаты.

Код может выглядеть примерно так:

std::vector<int> numbers;

srand(time(NULL));

std::generate_n(std::back_inserter(numbers), 10, rand);
std::sort(numbers.begin(), numbers.end());
std::copy(numbers.begin(), std::unique(numbers.begin(), numbers.end()), 
          std::ostream_iterator<int>(std::cout, "\t"));

 // Or, as @Chris pointed out:
 std::unique_copy(numbers.begin(), numbers.end(),
          std::ostream_iterator<int>(std::cout, "\t"));

Обратите внимание, что с std::unique возвращает итератор в конец диапазона уникальных чисел, нам вообще не нужно стирать остальные - мы можем просто использовать это как конец отображаемого диапазона.

Также обратите внимание, что, поскольку я сгенерировал числа здесь, было бы довольно необычно удалять что-либо - учитывая диапазон чисел, производимый типичной реализацией rand() было бы довольно необычно видеть, что он производит дубликаты всего за 10 итераций.

Если вам нужно сохранить первоначальный порядок, у вас есть несколько вариантов. Один состоит в том, чтобы вставить каждый элемент в std::set (или же std::unordered_set), поскольку вы распечатали его, и только распечатали его из вставки в набор, было успешно (то есть, это не было ранее).


1. Хотя это только одна из многих причин std::vector над массивом.

Другие вопросы по тегам