static std::map <unsigned int, CPCSteps> bestKvariables;
inline void copyKBestVar(MaxMinVarMap& vMaxMinAll, size_t& K, std::vector<unsigned int>& temp)
{
// copy top k variables and store in a vector.
MaxMinVarMap::reverse_iterator iter1;
size_t count;
for (iter1 = vMaxMinAll.rbegin(), count = 0; iter1 != vMaxMinAll.rend()&& count <= K; ++iter1, ++count)
{
temp.push_back(iter1->second);
}
}
void myAlgo::phase1(unsigned int& vTarget)
{
CPCSteps KBestForT; // To store kbest variables for only target variable finally put in a global storage
KBestForT.reserve(numVars);
std::vector<unsigned int> tempKbest;
tempKbest.reserve(numVars);
.......
.......
copyKBestVar(mapMinAssoc, KBestSize, tempKbest); // Store k top variables as a k best for this CPC variable for each step
KBestForT.push_back(tempKbest);
.....
.....
bestKvariables.insert(make_pair(vTarget, KBestForT)); // Store k best in a Map
.....
....
}
问题:Map“bestKvariables”不会覆盖第一个元素,但会不断更新其余元素。我试图调试它,但我发现的问题是插入命令。
提前感谢您的帮助。
另一个问题:我是否可以在开头预留地图的大小(如vector.reserve(..))以避免插入成本。
很抱歉提供的信息不足。
我的意思是,如果有四个vTarget变量1,2,3,4。我对每个变量进行一些统计计算。 这些变量有多个迭代,我想在地图中存储每个变量的前k个结果,以便在下一次迭代时使用它。
我看到第一个插入的变量(带有键unsigned int“vTarget”)在进一步的迭代中没有更新(它仍然是第一次迭代时插入的值)。 但其他变量(在第一个之后插入的键)仍然会更新。
答案 0 :(得分:3)
与另一个问题:我是否可以在开头预留地图的大小(如vector.reserve(..))以避免插入成本。
std::map
不同, reserve()
不具有std::vector
功能。
通常,标准库为容器提供功能,这些容器提供并确保良好的性能或提供实现相同的方法。
对于像std::vector
这样的容器,重新分配其存储空间可能非常昂贵
操作。对push_back()
的简单调用可以导致std::vector
中的每个元素都被复制到新分配的内存块中。对reserve()
的调用可以避免std::vector
的这些不必要的分配和复制操作,因此也为它提供了相同的操作。
std::map
永远不需要复制所有现有/剩余元素,因为插入或删除了新元素。因此,它不提供任何此类功能。
虽然标准没有规定应该如何实现std::map
,但预期的行为和所需的复杂性可确保大多数实现将其实现为tree
,而不像std::vector
那样需要元素被分配在连续的内存位置。
答案 1 :(得分:1)
map::insert
不应该更新/覆盖任何,只是插入尚未存在的元素。使用operator[]
进行更新,它还会在指定的键不存在时插入元素。