2016-01-07 4 views
-1

Я искал решение моей проблемы, но не нашел ответа. Следующий код предназначен только для обучения. Я хочу, чтобы удалить все элементы со значением 3 в этом векторе:Как найти значение в отсортированном векторе (C++)

std::vector<int> v{1,1,2,2,2,3,3,4,4}; 

Я пытался решить, как это:

// только отрывок из кода

iterator erase(T const& elem) { 
    return v.erase(std::remove(v.begin(), v.end(), elem), v.end()); 
} 

Но в моей тестовый случай, я ожидаю, что итератор будет указывать на значение 4, но в моем коде он указывает на значение 3. Он удаляет только первые 3 из моего вектора.

Как удалить оба значения «3», чтобы итератор возвращал точки на 4?

Благодарим за помощь!

ответ

2

Хотя std::remove будет работать, он не использует преимущества сортировки контейнера. Для этого вам нужно найти диапазон, содержащий все целевые значения. Например:

#include <algorithm> 
#include <vector> 

void remove(std::vector<int>& vec, int value) { 
    auto lb = std::lower_bound(vec.begin(), vec.end(), value); 
    auto ub = std::upper_bound(vec.begin(), vec.end(), value); 
    vec.erase(lb, ub); 
} 
+0

Это верная версия – fjardon

5

Ваш код работает, как ожидалось:

std::vector<int> v{1,1,2,2,2,3,3,4,4}; 

auto it = erase(3) 
assert(v == std::vector<int>({1,1,2,2,2,4,4}); 
assert(*it == 4); 

Возвращенный точки итераторов мимо последнего элемента, который был удален.

Вы просто неправильно интерпретировали возвращаемое значение vector::erase.

+0

[demo] (https://ideone.com/b3U2Nx) –

0

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

Если вы просто посмотрите на вектор v, вы заметите, что все «3» действительно удалены.

Смежные вопросы