C++ 从std::vector中删除元素时出现运行时错误
我有一个向量C++ 从std::vector中删除元素时出现运行时错误,c++,vector,erase,C++,Vector,Erase,我有一个向量索引,其中包含要删除的元素的索引 从矢量单词 vector<int> Index; vector<int> words; 向量索引; 向量词; 我尝试使用这个方法,但是我的程序在运行时崩溃了为什么? 发生了什么事 for(int t1 = 0; t1 < index.size(); t1++) { words.erase(words.begin()+ index[t1]) } for(int t1=0;t1
索引
,其中包含要删除的元素的索引
从矢量单词
vector<int> Index;
vector<int> words;
向量索引;
向量词;
我尝试使用这个方法,但是我的程序在运行时崩溃了为什么?
发生了什么事
for(int t1 = 0; t1 < index.size(); t1++)
{
words.erase(words.begin()+ index[t1])
}
for(int t1=0;t1
谢谢。尝试反向执行该操作。一旦删除以后的索引,后续索引将变得无效
我假设您的索引是有序的。如果没有,请对其进行排序,然后确保首先删除最大索引。尝试反向执行该操作。一旦删除以后的索引,后续索引将变得无效
我假设您的索引是有序的。如果没有,请对它们进行排序,然后确保首先删除最大的索引。如果不知道如何声明和初始化单词和索引,就很难确切地说出程序崩溃的原因
然而,最可能发生的情况是,在从单词
中删除一个元素后,并且在所有后续元素向左移动一个位置后,索引
中的索引可能会索引向量新端点以外的位置
当i
大于向量的大小时,计算words.begin()+i
将导致未定义的行为(在您的情况下,这表现为崩溃)
如果索引向量按递增顺序排序,只需恢复循环:
for(int t1 = index.size() - 1; t1 >= 0; --t1)
{
words.erase(words.begin() + index[t1]);
}
或者,您也可以使用原始循环并按降序对索引进行排序。如果不了解如何声明和初始化单词和索引,就很难确切地说出程序崩溃的原因
然而,最可能发生的情况是,在从单词
中删除一个元素后,并且在所有后续元素向左移动一个位置后,索引
中的索引可能会索引向量新端点以外的位置
当i
大于向量的大小时,计算words.begin()+i
将导致未定义的行为(在您的情况下,这表现为崩溃)
如果索引向量按递增顺序排序,只需恢复循环:
for(int t1 = index.size() - 1; t1 >= 0; --t1)
{
words.erase(words.begin() + index[t1]);
}
或者,您可以使用原始循环并按降序对索引进行排序。这里的问题是,在删除向量中的某些元素时,您正在更新向量的大小
请尝试以下方法:
for(int t1 = index.size()-1; t1 >= 0; --t1)
{
words.erase(words.begin()+index[t1])
}
这里的问题是,当删除向量中的某些元素时,您正在更新向量的大小
请尝试以下方法:
for(int t1 = index.size()-1; t1 >= 0; --t1)
{
words.erase(words.begin()+index[t1])
}
vectora={0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0};
矢量索引;
int t=0;
而(t0&&a[t]!=1)
{
指数。推回(t);
t=t-1;
}
排序(index.begin(),index.end());
擦除(std::unique(index.begin()、index.end()、index.end());
库特
vectora={0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0};
矢量索引;
int t=0;
而(t0&&a[t]!=1)
{
指数。推回(t);
t=t-1;
}
排序(index.begin(),index.end());
擦除(std::unique(index.begin()、index.end()、index.end());
cout vector words是整数向量向量索引包含我必须从单词中删除的整数索引步骤1:我对向量索引排序(index.begin(),index.end());第二步:我通过循环单词来删除elements@HaniGoc:嗯,所以问题有点复杂,当你删除向量的一个元素时,它会重新排列向量的内容。words.erase(words[index[t1]])错误:没有匹配的函数来调用std::vector::erase(int&)哦,我明白了,你的意思是我应该减少向量索引的指数?@Kevin也许你应该在你的答案中进一步阐述这个问题。很明显,有人(不止一次;-))被这个问题绊倒了:如果从向量中删除元素,索引会改变,但只有引用了后续删除元素的元素的索引才会无效。因此,通过反向迭代进行擦除是节省,而正向迭代需要额外的努力。向量字是整数向量向量向量索引包含我必须从字中删除的整数索引步骤1:我对向量索引排序(index.begin(),index.end());第二步:我通过循环单词来删除elements@HaniGoc:嗯,所以问题有点复杂,当你删除向量的一个元素时,它会重新排列向量的内容。words.erase(words[index[t1]])错误:没有匹配的函数来调用std::vector::erase(int&)哦,我明白了,你的意思是我应该减少向量索引的指数?@Kevin也许你应该在你的答案中进一步阐述这个问题。很明显,有人(不止一次;-))被这个问题绊倒了:如果从向量中删除元素,索引会改变,但只有引用了后续删除元素的元素的索引才会无效。因此,通过反向迭代进行擦除是节省,而正向迭代需要额外的努力。向量字是整数向量向量向量索引包含我必须从字中删除的整数索引步骤1:我对向量索引排序(index.begin(),index.end());步骤2:我循环遍历单词以删除元素vector words是整数向量vector index包含我必须从单词中删除的整数的索引步骤1:我对向量索引排序(index.begin(),index.end());步骤2:我循环遍历单词以删除元素问题:每次擦除(大小、迭代器等)后,您的单词向量都会更新,但索引不会更新