Можно ли удалить определенные элементы из вектора на основе информации из другого вектора?

0

Допустим, что у нас есть векторы A и B, которые содержат объекты, не являющиеся примитивными данными.

Вектор B будет содержать информацию о том, какие элементы должны быть удалены из вектора A. Я не хочу полагаться на индекс, если это возможно.

Я подозреваю, что в Java это можно сделать с помощью вызова метода removeAll, в котором вы передаете список вещей, которые нужно удалить в качестве аргумента.

Возможно ли это с языком C++?

Благодарю!

  • 0
    Что за информация? Можете привести пример?
  • 1
    Все возможно: D
Показать ещё 4 комментария
Теги:
vector
containers

3 ответа

5

Если векторы отсортированы, вы можете использовать std::set_difference. На самом деле вы не сортируете их в первую очередь, вы не можете добиться лучшего, чем n ^ 2 с точки зрения сложности. Поэтому мое предложение: сортировать векторы и использовать set_difference.

  • 0
    Используйте forward_list для лучшей скорости сортировки.
  • 1
    @ lucas92: маловероятно.
3

Не зная специфики того, что содержит A и B, можно сделать что-то вроде этого:

std::vector<int> A;
std::vector<int> B;
// fill in your vectors
A.erase(std::remove_if(A.begin(), A.end(), [&](int i)
{
    return std::find(B.begin(), B.end(), i) != B.end();
}), A.end());

Это будет искать B для всего, что соответствует A Если что-то найдено, оно будет удалено.

2

Этот процесс можно разложить на:

1) Выберите метод сравнения, который квалифицирует элемент, подлежащий удалению,

2) Найдите способ удаления выбранных элементов (либо как непрерывный диапазон, либо один за другим).

Почему это должно быть проблемой? Вам нужно только найти способ сравнить элементы на векторе B с элементами на векторе A, и на основе этого вы создадите список элементов, которые нужно удалить, а затем вы удалите их.

Ваш вектор, конечно, может быть вектором некоторого класса, который содержит все свойства, необходимые для сравнения между объектами в и B.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню