映射写入失败:无法覆盖第一个元素

Map inserstion failure: can not overwrite first element?

本文关键字:覆盖 第一个 元素 失败 映射      更新时间:2023-10-16
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
    .....
    ....
}

问题:映射"bestKvariables"不会覆盖第一个元素,而是不断更新其余元素。我试图调试它,但我发现的问题出在插入命令中。

提前感谢您的帮助。

另一个问题:我是否可以在开始时保留地图的大小(如vector.reserve(..((以避免插入成本。

很抱歉提供的信息不足。

我的意思是如果有四个 vTarget 变量 1、2、3、4。我为每个变量做一些统计计算。这些变量有多个迭代,我想将每个变量的前 k 个结果存储在地图中,以便在下一次迭代中使用。

我看到第一个插入的变量(带有键无符号整数"vTarget"(在进一步迭代时没有更新(它仍然是第一次迭代时插入的值(。但其他变量(在第一个变量之后插入的键(将保持更新。

另一个问题:我是否可以在开始时保留地图的大小(如vector.reserve(..((以避免插入成本。

std::vector不同,std::map没有reserve()功能。
通常,标准库为容器提供函数,这些函数提供并确保良好的性能或提供实现相同性能的方法。

对于像std::vector这样的容器,重新分配其存储可能非常昂贵操作。对push_back()的简单调用可能导致将std::vector中的每个元素复制到新分配的内存块中。对reserve()的调用可以避免这些不必要的分配和std::vector的复制操作,因此为其提供了相同的操作。

std::map永远不需要仅仅因为插入或删除了新元素而复制所有现有/剩余元素。因此,它不提供任何此类功能。

虽然该标准没有指定如何实现std::map,但预期的行为和所需的复杂性确保大多数实现将其实现为tree,不像std::vector需要在连续的内存位置分配元素。

map::insert不应该

更新/覆盖任何内容,只需插入尚不存在的元素即可。使用 operator[] 进行更新,它还会在指定的键尚不存在时插入元素。