c++ - 为什么在遍历此 vector 时会出现段错误?

标签 c++ vector iterator std

我需要遍历这个 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

关于c++ - 为什么在遍历此 vector 时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623457/

相关文章:

c++ - 函数 try block 何时有用?

c++ - 有什么明确的解释吗?

Java:空指针双端队列迭代器

c++ - 重载默认构造函数导致错误

c++ - 不使用 ATL 实现 COM IDispatch

c++ - Google::protobuf + boost::asio 失败

c++ - vector<char> 优于字符串的好处?

c - 如何在新函数中设置 Typedef Struct 定义的指针值?

c++ - 类模板 "std::iterator"的参数列表丢失

java - 测试两个迭代器的相等性?