【问题标题】:Map inserstion failure: can not overwrite first element?地图插入失败:不能覆盖第一个元素?
【发布时间】:2011-10-12 12:33:03
【问题描述】:
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 个结果存储在地图中以在下一次迭代中使用它。

我看到第一个插入的变量(键为 unsigned int "vTarget")在进一步的迭代中没有更新(它仍然是第一次迭代时插入的值)。 但是其他变量(在第一个之后插入的键)保持更新。

【问题讨论】:

  • not overwriting the first element, but it keeps updating the rest of the elements 是什么意思?也许你可以举个例子或解释你期望它做什么。
  • 问题格式...有帮助
  • 只是猜测,每个唯一键只能存储一个值。如果两个键可以相同,也许你需要一个 multi_map。
  • 表示,它不更新第一个插入的键,它保持以前的值。但对于其他键,它会在每次迭代时更新。

标签: c++ stl map


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    map::insert 不应该更新/覆盖任何东西,只是插入 尚未出现的元素。使用operator[]进行更新,当指定的key不存在时也会插入元素。

    【讨论】:

    • 谢谢,但关键是“vTarget”,bestKvariables.insert(make_pair(vTarget, KBestForT));无符号整数 vTarget;
    • @user986789 ??我不知道你想用这条评论告诉我什么,但是当你这样做 bestKvariables[vTarget]=KBestForT; 时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多