我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
当前回答
如果需要擦除for循环中的元素,请执行以下操作:
for(int i = 0; i < vec.size(); i++){
if(condition)
vec.erase(vec.begin() + i);
}
其他回答
前面的答案假设您总是有一个带符号的索引。遗憾的是,std::vector使用size_type进行索引,使用difference_type进行迭代器算术,所以如果你启用了"-Wconversion"和friends,它们就不能一起工作。这是另一种回答问题的方式,同时能够处理有符号和无符号:
删除:
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;
}
删除带索引的元素:
vec.erase(vec.begin() + index);
删除带值的元素:
vec.erase(find(vec.begin(),vec.end(),value));
如果你有一个无序向量,你可以利用它是无序的这一事实,并使用我在CPPCON上从Dan Higgins那里看到的东西
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;
}
由于列表顺序无关紧要,只需取列表中的最后一个元素并将其复制到您想要删除的项之上,然后弹出并删除最后一项。
erase方法将以两种方式使用:
擦除单个元素: 向量。Erase (vector.begin() + 3);//删除第四个元素 元素擦除范围: 向量。删除(vector.begin() + 3, vector.begin() + 5);//从第4个元素删除到第6个元素
如果需要擦除for循环中的元素,请执行以下操作:
for(int i = 0; i < vec.size(); i++){
if(condition)
vec.erase(vec.begin() + i);
}