插入新元素后,存储在向量中的struct字段的C ++值发生变化

问题描述

我有一个代码,其结构类似于以下代码。基本上,类Sorted维护将A.key映射到A的向量的映射,并按A.value排序。方法process将元素传递的参数添加到映射中A.key索引的向量中。在我的等效于此代码的实际代码中,我总是得到存储在地图矢量中的A.key之一,该值具有巨大的值(140737263711184)或0而不是1或2。

从我的调试试验中,我怀疑它是在重新分配基础向量时发生的,因为发生此问题时向量容量将从16跳到32。

我知道下面的代码性能不高,因为结构总是插入在向量的前面,但这不是问题的重点(最后一个带size_t的for循环都不是for-auto)。>

据我了解,重新分配会使存储在向量中的引用/指针无效。但就我而言,向量包含类型A的元素,而不是A&A*的元素。我不明白插入元素后,按值存储在向量中的结构的无符号长字段怎么可能会改变。在此示例中,我无法发送确切的代码并且无法重现错误,但是这些是错误的主要来源。如果我在第17次插入之后立即读取数据,则先前第一个元素的密钥已损坏。我也处于并发设置中,它解释了粗糙的锁。

任何提示都会有所帮助!

#include <iostream>
#include <stdio.h>
#include <map>
#include <vector>
#include <algorithm>
#include <mutex>
struct A{
    A(){}
    A(unsigned long a,unsigned long key,int value,int d,bool e)
        :a(a),key(key),value(value),d(d),e(e){}
    unsigned long   a;
    unsigned long key;
    int value;
    int d;
    bool e;
};

class Sorted{
    
    public:
        
        Sorted(std::vector<unsigned long> keys){
            for(auto &&key: keys){
                aSorted.insert(std::pair<int,std::vector<A>>(key,std::vector<A>()));
            }
        }
        void process(A a){
            addInOrder(a);
        }
        std::map<unsigned long,std::vector<A>> aSorted;
    private:
        std::mutex m;
        void addInOrder(A toAdd){
            m.lock();
            std::vector<A>::iterator index = std::find_if(aSorted.at(toAdd.key).begin(),aSorted.at(toAdd.key).end(),[toAdd](A a){return toAdd.key == a.key && toAdd.value < a.value;});
            aSorted.at(toAdd.key).insert(index,toAdd);
            m.unlock();
        }
};
int main() {
    std::vector<unsigned long> keys;
    keys.push_back(1);
    keys.push_back(2);

    Sorted sorted =  Sorted(keys);
    for(int i = 1; i <= 2; i++){
        for(int j =30; j > 0; j--){
            sorted.process(A(i,i,j,false));
        }
    }
    for(int key = 1; key <= 2; key++){
        for(size_t i = 0; i < sorted.aSorted.at(key).size(); i++){ 
        A valueInVec =  sorted.aSorted.at(key).at(i);
        std::cout << "key in vec: " << valueInVec.key << " value in vec: " << valueInVec.value  << std::endl;
        }
    }
    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...