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
, Эти контейнеры обеспечивают уникальность ваших товаров.
- Используйте
std::vector
вместо массива, так что вы можете стереть элементы 1. - Если вам не нужно поддерживать исходный порядок, возможно, его проще всего отсортировать, а затем используйте
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
над массивом.