如何修复使用矢量和迭代器打印值的错误
How to fix the error of printing values using vector and iterators
给定集合 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
足够的空间。这只有在您事先知道矢量将变得多大时才有效。
另一种方法是使用集合而不是向量。迭代器失效仍然可以发生在集合中,但规则的限制性比向量少得多。
相关文章:
- 了解运算符重载和迭代器,为什么它会打印出"wrhrwwr"?
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 从矢量不需要的值进行迭代器打印
- 使用迭代器打印矢量元素
- 通过迭代器打印出地图的值
- C++ Map erase(),迭代器打印 erased 元素
- 如何修复使用矢量和迭代器打印值的错误
- 打印一个列表给出错误,指出迭代器不可递减
- 如何使用迭代器在列表中打印类对象
- 似乎无法使用<VERTEX>迭代器在 for 循环中打印列表顶点?C++
- 如何在不使用迭代器的情况下在 C++ 中打印地图
- 为什么 g++ 需要 -fallowive 标志来打印 c++ 中的迭代器值
- 如何打印迭代器类型列表<pair<int,int>>::iterator itrator it指向的元素
- 我可以用cout而不是迭代器循环打印STL映射吗?
- C++流和迭代器:为什么它只打印一次
- 迭代器打印两个值,一个是文本,另一个是指针
- 矢量迭代器 -> 打印序列(缺少参数)
- 在std::map中打印迭代器的索引
- 如何为一组集合打印迭代器
- 如何在c++中打印迭代器