问题描述
我有一个代码,其结构类似于以下代码。基本上,类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 (将#修改为@)