首页 > 解决方案 > 如何修复使用向量和迭代器打印值的错误

问题描述

给出了一组 S 和 Q 查询。最初,S 为空。在每个查询中:

将正整数 X 输入到 S 中。对于此查询之前的每个 y ∈(属于)S 使得 y≠X,您还应该将 y⊕X 插入到 S 中(⊕ 表示 XOR 操作)。该集合不能有重复的元素,因此如果您尝试向 S 中插入一个已经存在于 S 中的元素,则不会发生任何事情。

我检查在这种情况下的集合,即向量是否为空(因为我需要按顺序存储值)并插入 x,否则,我使用迭代器在向量中查找 x 的值并从头开始运行一个循环直到最后并用 x 检查循环中元素的异或,如果不存在,则将其插入向量中。

该代码给出了大部分部分的正确答案,但有时给出了一些垃圾值。

        cin>>x;
        if(v.empty()){
            v.push_back(x);
        }else{
            verify = check_set(x,v);
            if(verify == false){
               v.push_back(x);
              it2 = find(v.begin(),v.end(),x);
                for(it=v.begin();it!=it2;it++){
                    temp = (*it)^x;
                    verify = check_set(temp,v);
                    if(verify == false){
                    v.push_back(temp);
                    check = check_x(temp);
                    }

预期产出 - 4 2 6 7 3 5 1

实际输出 - 4 2 6 7 3 13046527 1

标签: c++

解决方案


您的代码违反了向量迭代器的规则之一。对于向量,如果将元素添加到向量中,则向量的任何迭代器都将无效。所以在这段代码中

it2 = find(v.begin(),v.end(),x);
for(it=v.begin();it!=it2;it++) {
    temp = (*it)^x;
    verify = check_set(temp,v);
    if(verify == false){
       v.push_back(temp); // it and it2 are invalidated here
       ...

你正在使你的迭代器无效,你不应该再使用它们了。这并不总是会导致问题,这就是为什么您大部分时间都能得到正确结果的原因。但可能任何时候你向一个向量添加一些东西,你都会使所有引用该向量的迭代器失效。

解决此问题的最简单方法是使用索引而不是迭代器。

另一种方法是在向其reserve添加任何内容之前在向量中留出足够的空间。这只有在你事先知道你的向量会有多大时才有效。

另一种方法是使用集合而不是向量。迭代器失效仍然可能发生在集合中,但规则的限制比向量少得多。


推荐阅读