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内存的电脑。不,我不需要更新它,或者更确切地说,我可以生成一个包含所需排列的新多重映射。