访问std::map中元素的最有效方法是什么
What is the Most Efficient Way to Access Elements in an std::map?
我有一个std::map<some_type, std::vector<another_type>>
作为类中的静态变量。我希望所述类的对象对应于映射的向量中的元素。我当时的想法是只使用迭代器来存储向量和映射,但我也考虑存储键的副本,这样我就可以使用map::find
来查找与之相关的值。推荐哪种方式更有效?
代码:
class example_class
{
private:
static std::map<some_type, std::vector<another_type>> my_list;
some_type::iterator map_it;
// I could either use this
std::vector<another_type>::iterator location_in_vector_it;
// or this
some_type copy_of_key;
public:
// the constructor creates a new element, or adds the value to the end
// of the vector in the preexisting element.
example_class(key, val);
};
推荐的方法是编写正确、易于理解且有意义的代码。关于效率:
- 如果
vector
可以增长,则存储vector
的迭代器是个坏主意,因为vector::insert
可以生成无效的迭代器 -
将索引存储到
vector
中(如果这是一个选项——这些向量如何改变?)允许在O(1)时间内获得元素,但在您的情况下,您仍然需要找到向量。 -
存储
map
的迭代器将允许您在O(1)时间内找到向量,并且该迭代器在修改map
后仍然有效(除非您删除迭代器指向的条目)。- 在
map
中存储对vector
的引用类似于使用迭代器,并且可能导致更可读的代码
- 在
- 存储密钥并使用
map::find
可以在O(lg n)时间内找到向量。这种方法可以处理您要查找的矢量已从map
中删除的情况
因此最安全的方法是存储键和索引,并编写代码来处理找不到元素的情况。但是<这是应该发生的事情吗>你想让其他人(可能是另一个相同类型的对象)删除你对象的元素吗?可能不会,因为每个对象都应该"对应于一个元素"。这是你的设计有问题吗?这是应该发生的事情吗>
如果我这样做,我可能想确保我的对象元素不会被粗暴地拿走。一种方法是使用共享指针。我可能会考虑存储std::vector<std::shared_ptr<another_type>>
,而不是将std::vector<another_type>
存储在map
中。根据对象销毁时应该发生的情况,我可能会将shared_ptr
更改为weak_ptr
,这样静态容器就不会维护不再存在的对象的数据。在任何一种情况下,每个对象都可以为其元素维护自己的shared_ptr
。这允许快速访问元素,并确保元素不会在对象被破坏之前被破坏
当然,最理想的方法取决于您需要将这些元素存储在静态容器中的原因。
如果my_list
的大小发生变化(除非您之前保留了所有内容),则无法将迭代器存储到my_list
中的向量。
最简单的方法是先在向量中存储关键字,然后再存储索引,假设您只推送新元素,而从不删除旧元素。最好的是带有索引的映射中的迭代器。
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法