gpt4 book ai didi

C++ - 修改所有 map 元素的键

转载 作者:太空狗 更新时间:2023-10-29 23:49:40 29 4
gpt4 key购买 nike

让我们考虑这段代码:

std::map< int, char > charMap;
for( auto& i : charMap )
{
charMap[ i.first + 1 ] = charMap[ i.first ];
charMap.erase( i.first );
}

假设 map 有一些带有随机键的值。我正在尝试将键移动 1。这是行不通的,因为循环会一直持续下去。有没有快速的方法让它发挥作用?

最佳答案

在C++17中,可以使用节点提取和拼接(见P0083R3):

std::map<int, char> tmpMap;

for (auto it = charMap.begin(); it != charMap.end(); )
{
auto nh = charMap.extract(it++); // node handle
++nh.key();
tmpMap.insert(tmpMap.end(), std::move(nh));
}

tmpMap.swap(charMap);

循环提取连续的 map 节点,对它们进行变异,然后将节点重新插入到 tmpMap 中(现在使用不同的键)。最后,charMap 为空,tmpMap 包含所有元素及其修改后的键,因此我们交换两者。

在 C++17 之前,您必须复制(或移动)值数据以插入具有新键的新元素。

std::map<int, char> tmpMap;

for (auto & p : charMap)
tmpMap.emplace_hint(tmpMap.end(), p.first + 1, std::move(p.second));

tmpMap.swap(charMap);

不过,这需要为节点分配内存,因此新的基于拼接的解决方案效率更高。

在任何一种情况下,我们都可以使用提示插入,因为我们正在以相同的顺序重建元素,所以最新的元素总是插入到最后。

关于C++ - 修改所有 map 元素的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38164274/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com