如何修复使用矢量和迭代器打印值的错误

How to fix the error of printing values using vector and iterators

本文关键字:打印 迭代器 错误 何修复      更新时间:2023-10-16

给定集合 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

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

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足够的空间。这只有在您事先知道矢量将变得多大时才有效。

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