为什么我得到一个分割错误,而通过这个向量迭代
Why do I get a segmentation fault while iterating through this vector?
我需要遍历这个向量并删除重复的。这段代码中的某个地方出现了分段错误。我的猜测是,它与在迭代器运行时删除元素有关,但我对这些迭代器的实际工作原理还没有具体的了解,所以我不能弄清楚。
vector<char *>::iterator iter;
for (iter = v->begin(); iter != v->end()-1; iter++ ){
char *aString = *iter;
int n = 1;
while(iter+n != v->end()){
int comparison = strcmp(aString, *(iter+n));
if(comparison == 0){
v->erase(iter + n);
}
n++;
}
}
真的,你只是有几个偏离一的问题。当您擦除一个元素时,您正在错误地比较end()
并增加n
:
for (iter = v->begin(); iter != v->end()-1; iter++ ){
^^^^^^^^
和
while(iter+n != v->end())
^^
下面的代码将满足您的要求(并演示它是有效的):
int main()
{
std::vector<const char*> v (4, "this");
std::vector<const char *>::iterator iter;
for (iter = v.begin(); iter < v.end(); iter++ ) {
std::cout << *iter << " ";
}
std::cout << std::endl;
for (iter = v.begin(); iter < v.end(); iter++ ){
const char *aString = *iter;
int n = 1;
while(iter+n < v.end()){
int comparison = strcmp(aString, *(iter+n));
if(comparison == 0){
v.erase(iter + n);
}
else
n++;
}
}
for (iter = v.begin(); iter < v.end(); iter++ ) {
std::cout << *iter << std::endl;
}
}
输出是:
this this this this this this
这个
没有正确地遍历vector的剩余部分。Beta建议的另一种替代方法是使用带有remove_if的erase-remove。这样的:
bool compare_strings(char * aString,char * bString)
{
return 0==strcmp(aString,bString);
}
void remove_duplicates(vector<char *> * v)
{
vector<char *>::iterator iter;
for (iter = v->begin(); iter != v->end(); iter++ ) {
v->erase(std::remove_if(iter+1,v->end(),compare_strings),v->end());
}
}
当你从vector中删除一个元素时,vector会缩短一个元素。试试这个:
if(comparison == 0){
v->erase(iter + n);
}
else{
n++;
}
从被擦除的vector对象开始,将使所有迭代器失效,因此您可能不应该像这样构造循环,而应该使用这样的标准习惯用法:
for (auto it = v.begin(); it != v.end(); ++it) // no end() - 1 -- may not be legal!
{
for (auto jt = it; jt != v.end(); )
{
if (jt == it) continue;
if (strcmp(*it, *jt) == 0)
{
jt = v.erase(jt);
}
else
{
++jt;
}
}
}
这段代码避免了对空向量的检查,因为您的代码没有考虑到这一点。
相关文章:
- C++11 迭代向量的新方法?
- 迭代向量以获得搜索功能
- 为什么迭代向量在 c++ 中给出固定地址?
- 如何从向量映射中迭代向量
- 我怎样才能在不重复的情况下随机迭代向量的每个元素
- 是否有用于迭代向量的函数,而不管其类型如何?
- 您可以在一段时间内迭代向量
- 迭代向量向量中的第 i 行
- 指针的迭代向量会导致分段错误
- 使用一个迭代器迭代向量的向量
- 迭代向量时跳过行
- 迭代向量以更新word_counter
- 迭代向量中属性具有特定值的元素范围
- 在C++中迭代向量
- 在迭代向量的 for 循环中无效使用非静态数据成员
- 在C++中迭代向量
- 迭代向量时陷入无限循环的问题
- 迭代向量字符串的字符(C++禁止指针和整数之间的比较)
- 在 c++11 中,迭代向量的最现代、最"right"的方法是什么
- 5秒内迭代向量5