c++ - 如何修复使用向量和迭代器打印值的错误
问题描述
给出了一组 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
添加任何内容之前在向量中留出足够的空间。这只有在你事先知道你的向量会有多大时才有效。
另一种方法是使用集合而不是向量。迭代器失效仍然可能发生在集合中,但规则的限制比向量少得多。
推荐阅读
- android - NFC-V ICODE SLIX (SL2S2002)
- reactjs - 根据来自 onClick React js 的条件添加属性
- r - ggpubr stat_compare_means:用两个分组变量显示显着性水平
- commit - 每次提交到 BitBucket 服务器上的每个分支的电子邮件通知
- c# - 自定义数据注释属性是静态的
- typescript - keyof 不允许参数(“预期 0 个参数,但得到 1”)
- python - 在列表中拆分列表
- apache-spark - Kafka 消费者请求超时
- php - 如何在 PHP 中生成 30 个从 1 到 100 的随机数
- android - 如何查看字体家族名称?