我有一个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(???);
当前回答
前面的答案假设您总是有一个带符号的索引。遗憾的是,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));
前面的答案假设您总是有一个带符号的索引。遗憾的是,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;
}
最快的方法(对于时间复杂度()=常量的编程竞赛)
可在1秒内擦除100M项目;
vector<int> it = (vector<int>::iterator) &vec[pos];
vec.erase(it);
最易读的方式: Vec.erase (vec.begin() + pos);
实际上,擦除功能适用于两种配置文件:
删除单个元素 迭代器擦除(迭代器位置); 删除一系列元素 迭代器擦除(迭代器先,迭代器后);
因为std:: vvector .begin()标志着容器的开始,如果我们想删除vector中的第i个元素,我们可以使用:
vec.erase(vec.begin() + index);
如果你仔细观察,vecc .begin()只是一个指向我们的向量的起始位置的指针,并且向它添加i的值将增加指向i位置的指针,因此我们可以通过以下方式访问指向第i个元素的指针:
&vec[i]
所以我们可以这样写:
vec.erase(&vec[i]); // To delete the ith element
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);
}