gpt4 book ai didi

C++ std::map 如何通过索引位置访问键

转载 作者:行者123 更新时间:2023-11-28 04:45:00 25 4
gpt4 key购买 nike

我想使用 C++ std::map 在 log(n) 时间内访问与给定键关联的值。由于 std::map 的键是排序的,从技术上讲,我可以按排序顺序的位置访问键。我知道 std::map 没有随机访问迭代器。是否有任何“类似 map ”的数据结构既提供通过键的访问(通过使用 [] 运算符),又通过键的位置按排序顺序提供(只读)随机访问。这是一个基本示例:

my_fancy_map['a'] = 'value_for_a'
my_fancy_map['b'] = 'value_for_b'

assert my_fancy_map.get_key_at_location(0) == 'a'
assert my_fancy_map.get_key_at_location(1) == 'b'
assert my_fancy_map.get_value_at_location(1) == 'value_for_b'
assert my_fancy_map['a'] == 'value_for_a'

最佳答案

您可以使用 Boost.MultiIndex 的 ranked indices :

Live On Coliru

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ranked_index.hpp>
#include <boost/multi_index/member.hpp>

using namespace boost::multi_index;

template<typename K,typename T>
using ranked_map=multi_index_container<
std::pair<K,T>,
indexed_by<
ranked_unique<member<std::pair<K,T>,K,&std::pair<K,T>::first>>
>
>;

#include <cassert>
#include <string>

int main()
{
ranked_map<std::string,std::string> m;

m.emplace("a","value for a");
m.emplace("b","value for b");

assert(m.nth(0)->first=="a");
assert(m.nth(1)->first=="b");
assert(m.nth(1)->second=="value for b");
assert(m.find("a")->second=="value for a");
}

但是请注意,nth 不是 O(1) 而是对数的,因此排名索引并非完全随机访问。

后记:另一个具有真正随机访问的替代方案是 Boost.Container 的 flat associative containers :

Live On Coliru

#include <boost/container/flat_map.hpp>
#include <cassert>
#include <string>

int main()
{
boost::container::flat_map<std::string,std::string> m;

m["a"]="value for a";
m["b"]="value for b";

assert(m.nth(0)->first=="a");
assert(m.nth(1)->first=="b");
assert(m.nth(1)->second=="value for b");
assert(m["a"]=="value for a");
}

这里的缺点是插入需要线性时间而不是对数时间。

关于C++ std::map 如何通过索引位置访问键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49417716/

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