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

时间:2019-07-15 04:31:44

标签: c++

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

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

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

《守则》为大部分部分提供了正确答案,但有时却提供了一些垃圾价值。

        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

1 个答案:

答案 0 :(得分:0)

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

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之前要留有足够的空间。这只有在您事先知道向量将要变大的情况下才有效。

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