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;
}
5
如果你想通过在vector中找到它的值来删除一个元素,你还需要在vector上执行此操作 .
vector<int> ar(n);
ar.erase(remove(ar.begin(), ar.end()), (place your value here from vector array));
10 回答
要删除单个元素,您可以执行以下操作:
或者,一次删除多个元素:
std :: vector上的erase方法被重载,因此调用它可能更清晰
当你只想删除一个元素时 .
erase
方法将以两种方式使用:实际上,
erase
函数适用于两个配置文件:由于std :: vec.begin()标记容器的开头,如果我们想删除向量中的第i个元素,我们可以使用:
如果仔细观察,vec.begin()只是指向我们向量的起始位置的指针,并且将i的值添加到它会将指针递增到i位置,所以我们可以通过以下方式访问指向第i个元素的指针:
所以我们可以写:
如果你有一个无序的向量,你可以利用它无序的事实,并使用我在CPPCON的Dan Higgins看到的东西
由于列表顺序无关紧要,只需取出列表中的最后一个元素并将其复制到要删除的项目的顶部,然后弹出并删除最后一项 .
如果您使用大型矢量(大小> 100,000)并想要删除大量元素,我建议您执行以下操作:
代码将vec中的每个数字除以3并将其复制到vec2 . 然后它在vec中复制vec2 . 它非常快 . 要处理20,000,000个元素,此算法仅需0.8秒!
我使用erase-method做了同样的事情,需要花费大量的时间:
要删除元素,请使用以下方法:
如需 more broad overview ,您可以访问:http://www.cplusplus.com/reference/vector/vector/erase/
之前的答案假设您 always 有一个签名索引 . 遗憾的是,
std::vector
使用size_type
进行索引,使用difference_type
进行迭代算术运算,因此如果启用了"-Wconversion"和朋友,则它们不能一起工作 . 这是回答问题的另一种方法,同时能够处理签名和未签名:去除:
采取:
如果你想通过在vector中找到它的值来删除一个元素,你还需要在vector上执行此操作 .
它会从这里删除你的 Value . 谢谢