C++ C++;多重映射操作

C++ C++;多重映射操作,c++,multimap,C++,Multimap,我创建了一个多重贴图,因为我有重复的关键点。但我想做一个有效的操作,这样我就可以生成一个新的多重贴图,并对齐后续更高的关键点。这就是我的意思: 这就是我所拥有的: key values 11 qwer 11 mfiri 21 iernr 21 ghfnfjf 43 dnvfrf 这就是我想要实现的 key values 11 qwer,iernr 11

我创建了一个多重贴图,因为我有重复的关键点。但我想做一个有效的操作,这样我就可以生成一个新的多重贴图,并对齐后续更高的关键点。这就是我的意思:

这就是我所拥有的:

key        values
11          qwer
11          mfiri
21          iernr
21          ghfnfjf
43          dnvfrf
这就是我想要实现的

key        values
11          qwer,iernr
11          mfiri,iernr
21         iernr,dnvfrf
21          ghfnfjf,dnvfrf
43          dnvfrf
我有大约1000万条参赛作品,所以我正在寻找一些高效的作品


在上面的值中,“qwer,iernr”是一个字符串。

看起来直接的方法可以很好地工作。地图元素将按升序排列(假设比较运算符适合您)。因此,只需遍历相等的范围,并在该范围之后使用元素的值对其进行修改,就可以满足您的需要


克隆映射(如果需要原始映射),获取第一个元素,获取其键的
equal_range()
,使用范围内第二个迭代器的值修改值(除非它是最后一个)。获取第二个迭代器的键的
equal_range()
。重复。

这里有一个简单的方法:

auto cur = map.begin();
auto next = map.upper_bound(cur->first);

for(; next != map.end(); next = map.upper_bound(cur->first))
{
    for(; cur != next; ++cur)
    {
        cur->second += ", ";
        cur->second += next->second;
    }
}
。。。给定一个
std::multimap映射


然而,任何转换10m+元素的操作都不会超快。

同意尤金的观点!另请参见以下关于相等_范围的参考()

要做到这一点,您只需迭代地图,同时按顺序构建新地图

您可以在两个级别执行此操作:

for (auto it=map.cbegin(); it != map.cend(); ) 
{ 
    // The inner loop is over all entries having the same key
    auto next_key_it=find_next_key_after(it);
    for (; it != next_key_it; ++it) {
         new_map.emplace_hint(new_map.end(), it->first, new_value(it->second, next_key_it));
    }
}
新的_value函数(或lambda)进行值转换(如果第二个参数是map.end(),则不进行值转换)

find_next_key_after(it)函数返回与map.upper_bound(it->first)相同的结果,但也可以实现为使用不同键对第一个条目进行线性搜索

这取决于您(预期)的密钥分布,使用哪种方法-如果密钥重复次数少且有限,则线性搜索更好;如果不同键的数量有限,且具有较大的相等键范围,则上界可能更好


对于保证的复杂度,线性搜索更好:整个算法具有O(n)复杂度。这是你能得到的最有效的方法。

因此,目标是为所有
i
的每个条目
map[i]
添加
map[i+1]
的一个值作为后缀?如果不是这样的话,你可以发布一些(伪)代码来描述你想要的,然后我们可以讨论如何提高效率。我只是在我的原始帖子中修改了表,这样就不会造成混乱。因此,我想使用下一个更高的键,如果当前键是(I),则不一定使用(I+1)键值。谢谢您必须创建一次新的多重贴图吗?或者每隔一段时间?在创建新地图后,是否需要更新原始地图?(添加/删除/修改值)如果需要,我可以创建多个。我可以创建的数量没有限制。我有一台带有6GB内存的电脑。不,我不需要更新它,或者更确切地说,我可以生成一个包含所需排列的新多重映射。