Kishaan Jeeveswaran Ответов: 3

Как удалить все копии элемента в массиве?


У меня есть векторный массив из n элементов, и я позволяю пользователям вводить n целых чисел. Теперь я хочу, чтобы мой массив содержал только различные целые числа. Другими словами, Я хочу, чтобы он удалил все копии целого числа так, чтобы в массиве осталось только одно вхождение каждого целого числа.

Если мой вектор p = {-1, 1, 4, 1, 4, 7, 3, 7, 7}

выход должен быть: p = {-1, 1, 3, 4, 7}

std::sort(p.begin(), p.end());
for (int i=1; p[i] == p[i+1]; i++){
    do {
    p.erase(p.begin() + i+1);
    } while (p[i]==p[i+1]);
}


Однако я не получаю должного результата. Может ли кто-нибудь предложить некоторые исправления в моем коде? Или даже предложить лучший способ кодирования на C++?

Что я уже пробовал:

Как вы можете видеть, я попытался отсортировать свой массив так, чтобы все копии целого числа располагались последовательно. Затем я стираю ближайший следующий элемент всякий раз, когда вижу два элемента одинакового значения.

3 Ответов

Рейтинг:
23

CPallini

Вы можете использовать std::unique после std::sort См. пример кода по адресу std:: unique - cppreference.com[^].


Kishaan Jeeveswaran

Это классный вариант. Но он не изменяет размер массива после удаления копий элементов, верно? Мне нужен размер массива после удаления всех копий!

Рейтинг:
2

Kishaan Jeeveswaran

Нашел решение!

Я использовал

std::sort(p.begin(), p.end());
p.erase( std::unique( p.begin(), p.end() ), p.end() );


И он автоматически удалил все копии и дал мне новый размер массива! Спасибо за предложение, ребята! :)


Рейтинг:
17

OriginalGriff

ГМ...посмотрите на свой цикл for: условие завершения - это когда найден первый недупликат, а не когда у вас закончились сравнения.
Вам нужен цикл для работы со всеми парами элементов и условие if внутри цикла, чтобы определить, следует ли удалить элемент.


Kishaan Jeeveswaran

Вы имеете в виду, что я должен ввести (p[i] != p[i+1]) в цикле for и заменить внутренний цикл do-while другим циклом for?

OriginalGriff

Нет, внешний цикл должен проверить, остались ли еще элементы (т. е. i < количество элементов), а внутренний цикл должен быть удален и заменен на if, который удаляет один элемент.

Kishaan Jeeveswaran

Ладно, понял! Я попробую. Спасибо за ваше время :)

OriginalGriff

Пожалуйста!