C++ 如何从std::vector<;中删除元素&燃气轮机;按索引?
我有一个std::vector,我想删除第n个元素。我该怎么做C++ 如何从std::vector<;中删除元素&燃气轮机;按索引?,c++,stl,vector,erase,C++,Stl,Vector,Erase,我有一个std::vector,我想删除第n个元素。我该怎么做 std::vector<int> vec; vec.push_back(6); vec.push_back(-17); vec.push_back(12); vec.erase(???); std::向量向量向量机; 向量推回(6); 向量推回(-17); 向量推回(12); 向量擦除(??); 要删除单个元素,可以执行以下操作: std::vector<int> vec; vec.push_back
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
std::向量向量向量机;
向量推回(6);
向量推回(-17);
向量推回(12);
向量擦除(??);
要删除单个元素,可以执行以下操作:
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
// Deletes the second element (vec[1])
vec.erase(std::next(vec.begin()));
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);
}
消除空洞(标准::矢量和矢量,尺寸位置)
{
std::vector::iterator it=vec.begin();
标准:预付款(it、pos);
删除(它);
}
擦除方法将以两种方式使用:
vector.erase( vector.begin() + 3 ); // Deleting the fourth element
vector.erase( vector.begin() + 3, vector.begin() + 5 ); // Deleting from fourth element to sixth element
如果您使用大向量(大小>100000)并希望删除大量元素,我建议您执行以下操作:
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;
}
实际上,
擦除
功能适用于两种配置文件:
- 删除单个元素
iterator erase (iterator position);
- 删除一系列元素
iterator erase (iterator first, iterator last);
vec.erase(vec.begin() + index);
如果仔细观察,vec.begin()只是指向向量起始位置的指针,向它添加i值会增加指向i位置的指针,因此我们可以通过以下方式访问指向第i个元素的指针:
&vec[i]
所以我们可以写:
vec.erase(&vec[i]); // To delete the ith element
要删除图元,请使用以下方法:
// declaring and assigning array1
std:vector<int> array1 {0,2,3,4};
// erasing the value in the array
array1.erase(array1.begin()+n);
//声明和分配数组1
std:向量数组1{0,2,3,4};
//擦除数组中的值
array1.erase(array1.begin()+n);
有关更广泛的概述您可以访问:前面的答案假设您总是有一个带符号的索引。遗憾的是,
std::vector
使用size\u-type
进行索引,而difference\u-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);
}
模板
无效删除(标准::向量&v,I索引)
{
const auto&iter=v.cbegin()+gsl::窄带投射(索引);
v、 擦除(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;
}
模板
T取值(标准::向量&v,I索引)
{
const auto&iter=v.cbegin()+gsl::窄带投射(索引);
自动val=*iter;
v、 擦除(iter);
返回val;
}
如果你有一个无序向量,你可以利用它无序的事实,使用我在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;
}
模板
从无序索引中删除静态布尔值(容器和容器,索引中的大小)
{
如果(inIndex
由于列表顺序无关紧要,只需将列表中的最后一个元素复制到要删除的项目顶部,然后弹出并删除最后一个项目。这里还有一种方法,如果要通过在vector中查找该元素的值来删除该元素,只需在vector中执行此操作
vector<int> ar(n);
ar.erase(remove(ar.begin(), ar.end()), (place your value here from vector array));
向量ar(n);
ar.erase(删除(ar.begin(),ar.end()),(将向量数组中的值放在这里);
它将从这里删除您的价值。
感谢您以最快的方式(对于按时间复杂度()=常数进行编程竞赛)
可在1秒内擦除100米项目
vector<int> it = (vector<int>::iterator) &vec[pos];
vec.erase(it);
vector it=(vector::iterator)&vec[pos];
删除(它);
最具可读性的方式:
vec.erase(vec.begin()+pos);
这个怎么样
void squeeze(vector<int> &v)
{
int j = 0;
for (int i = 1; i < v.size(); i++)
if (v[i] != v[j] && ++j != i)
v[j] = v[i];
v.resize(j + 1);
}
void压缩(矢量和v)
{
int j=0;
对于(int i=1;i
我建议你读一下这篇文章,因为我相信这就是你想要的
例如,如果您使用
vec.erase(vec.begin() + 1, vec.begin() + 3);
您将擦除向量的第n个元素,但当您擦除第二个元素时,向量的所有其他元素都将移位,向量大小将为-1。由于vector size()正在减小,如果循环遍历vector,这可能是个问题。如果你有这样的问题,建议在标准C++库中使用现有的算法。以及“移除”或“移除”
希望这会有所帮助对某些人来说,这似乎是显而易见的,但要详细说明上述答案: 如果在整个向量上循环使用
erase
删除std::vector
元素,则应以相反顺序处理向量,即使用
for(int i=v.size()-1;i>=0;i--)
代替(古典)
for(inti=0;i
原因是索引受erase
的影响,因此如果删除第4个元素,则前5个元素现在是新的第4个元素,如果执行i++
,则循环不会处理它
下面是一个简单的例子来说明这一点,我想删除一个int向量的所有赔率元素
#include <iostream>
#include <vector>
using namespace std;
void printVector(const vector<int> &v)
{
for (size_t i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v1, v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i);
}
// print v1
cout << "v1: " << endl;
printVector(v1);
cout << endl;
// print v2
cout << "v2: " << endl;
printVector(v2);
// Erase all odd elements
cout << "--- Erase odd elements ---" << endl;
// loop with decreasing indices
cout << "Process v2 with decreasing indices: " << endl;
for (int i = v2.size() - 1; i >= 0; i--)
{
if (v2[i] % 2 != 0)
{
cout << "# ";
v2.erase(v2.begin() + i);
}
else
{
cout << v2[i] << " ";
}
}
cout << endl;
cout << endl;
// loop with increasing indices
cout << "Process v1 with increasing indices: " << endl;
for (int i = 0; i < v1.size(); i++)
{
if (v1[i] % 2 != 0)
{
cout << "# ";
v1.erase(v1.begin() + i);
}
else
{
cout << v1[i] << " ";
}
}
return 0;
}
请注意,在索引增加的第二个版本上,由于
i++
删除索引为的元素,因此不会显示偶数,因为它们被跳过:
vec.erase(vec.begin() + index);
删除具有以下值的元素:
vec.erase(find(vec.begin(),vec.end(),value));
如果需要删除for循环内的元素,请执行以下操作:
for(int i = 0; i < vec.size(); i++){
if(condition)
vec.erase(vec.begin() + i);
}
for(int i=0;i 考虑使用STD::DeQE,它可以在两端插入和删除。不,不要考虑使用DEQE,因为您可能想要删除一个元素,这真是一个很差的建议。有一大堆的理由可以解释为什么你要使用deque或vector。的确,从向量中删除一个元素可能代价高昂——特别是如果向量很大,但没有理由认为
vec.erase(vec.begin() + index);
vec.erase(find(vec.begin(),vec.end(),value));
for(int i = 0; i < vec.size(); i++){
if(condition)
vec.erase(vec.begin() + i);
}