Map inserstion failure:无法覆盖第一个元素?

时间:2011-10-12 12:33:03

标签: c++ stl map

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”)在进一步的迭代中没有更新(它仍然是第一次迭代时插入的值)。 但其他变量(在第一个之后插入的键)仍然会更新。

2 个答案:

答案 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[]进行更新,它还会在指定的键不存在时插入元素。