10 ответов:
чтобы удалить один элемент, вы можете сделать:
std::vector<int> vec; vec.push_back(6); vec.push_back(-17); vec.push_back(12); // Deletes the second element (vec[1]) vec.erase(vec.begin() + 1);или, чтобы удалить более одного элемента за один раз:
// Deletes the second through third elements (vec[1], vec[2]) vec.erase(vec.begin() + 1, vec.begin() + 3);
метод стирания на std:: vector перегружен, поэтому, вероятно, яснее вызвать
vec.erase(vec.begin() + index);когда вы хотите стереть только один элемент.
template <typename T> void remove(std::vector<T>& vec, size_t pos) { std::vector<T>::iterator it = vec.begin(); std::advance(it, pos); vec.erase(it); }
The
eraseметод будет использоваться двумя способами:
удаление одного элемента:
vector.erase( vector.begin() + 3 ); // Deleting the fourth elementудаление ряда элементов:
vector.erase( vector.begin() + 3, vector.begin() + 5 ); // Deleting from fourth element to sixth element
на самом деле
eraseфункция работает для двух профилей:
удаление одного элемента
iterator erase (iterator position);удаление ряда элементов
iterator erase (iterator first, iterator last);С std:: vec.begin () отмечает начало контейнера, и если мы хотим удалить I-й элемент в нашем векторе, мы можем использовать:
vec.erase(vec.begin() + index);если вы посмотрите внимательно, век.begin () - это просто указатель на начальную позицию нашего вектора и добавление значение i к нему увеличивает указатель на позицию i, поэтому вместо этого мы можем получить доступ к указателю на I-й элемент с помощью:
&vec[i]так что мы можем написать:
vec.erase(&vec[i]); // To delete the ith element
Если у вас есть неупорядоченный вектор, вы можете воспользоваться тем, что он неупорядочен, и использовать то, что я видел у Дэна Хиггинса в CPPCON
template< typename TContainer > static bool EraseFromUnorderedByIndex( TContainer& inContainer, size_t inIndex ) { if ( inIndex < inContainer.size() ) { if ( inIndex != inContainer.size() - 1 ) inContainer[inIndex] = inContainer.back(); inContainer.pop_back(); return true; } return false; }поскольку порядок списка не имеет значения, просто возьмите последний элемент в списке и скопируйте его поверх элемента, который вы хотите удалить, а затем поп и удалить последний элемент.
Если вы работаете с большими векторами (размер > 100 000) и хотите удалить много элементов, я бы рекомендовал сделать что-то вроде этого:
int main(int argc, char** argv) { vector <int> vec; vector <int> vec2; for (int i = 0; i < 20000000; i++){ vec.push_back(i);} for (int i = 0; i < vec.size(); i++) { if(vec.at(i) %3 != 0) vec2.push_back(i); } vec = vec2; cout << vec.size() << endl; }код принимает каждое число в vec, которое не может быть разделено на 3 и копирует его в vec2. После этого он копирует vec2 в vec. Это довольно быстро. Для обработки 20 000 000 элементов этот алгоритм занимает всего 0,8 сек!
Я сделал то же самое с erase-методом, и это занимает много и много времени:
Erase-Version (10k elements) : 0.04 sec Erase-Version (100k elements) : 0.6 sec Erase-Version (1000k elements): 56 sec Erase-Version (10000k elements): ...still calculating (>30 min)
для удаления элемента используйте следующий способ:
// declaring and assigning array1 std:vector<int> array1 {0,2,3,4}; // erasing the value in the array array1.erase(array1.begin()+n);на более широкий обзор вы можете посетить: http://www.cplusplus.com/reference/vector/vector/erase/
предыдущие ответы предполагают, что вы всегда подписанный индекс. К сожалению,
std::vectorиспользуетsize_typeдля индексации, иdifference_typeдля арифметики итератора, поэтому они не работают вместе, если у вас есть" - Wconversion " и друзья включены. Это еще один способ ответить на вопрос, имея возможность обрабатывать как подписанные, так и неподписанные:удалить:
template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type> void remove(std::vector<T> &v, I index) { const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index); v.erase(iter); }взять:
template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type> T take(std::vector<T> &v, I index) { const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index); auto val = *iter; v.erase(iter); return val; }
вот еще один способ сделать это,если вы хотите удалить элемент, найдя его значение в векторе, вам просто нужно сделать это на векторе.
vector<int> ar(n); ar.erase(remove(ar.begin(), ar.end()), (place your value here from vector array));он удалит ваше значение отсюда. спасибо
Comments