C++ C++;-如何避免在使用[]运算符替换后查找映射条目?

C++ C++;-如何避免在使用[]运算符替换后查找映射条目?,c++,map,C++,Map,在使用[]运算符替换映射中的元素后,如何避免在映射上调用.find()?(一点背景:我正在开发一个高性能的应用程序,这是代码的关键部分。)示例: 首先存储引用,而不是直接分配给[]运算符的结果 DataType &data = m_Map[key]; data = value; // Continue to use `data` here 首先存储引用,而不是直接分配给[]运算符的结果 DataType &data = m_Map[key]; data = valu

在使用[]运算符替换映射中的元素后,如何避免在映射上调用.find()?(一点背景:我正在开发一个高性能的应用程序,这是代码的关键部分。)示例:


首先存储引用,而不是直接分配给
[]
运算符的结果

 DataType &data = m_Map[key];
 data = value;

 // Continue to use `data` here

首先存储引用,而不是直接分配给
[]
运算符的结果

 DataType &data = m_Map[key];
 data = value;

 // Continue to use `data` here
由于返回了一个引用,甚至迭代器都无效,因此您可以轻松地避开它

auto& element = m_Map[key];
element = value;
// use element
第二种选择:您可以使用从返回的迭代器(如果您需要检查元素是否存在,则为最佳选择)

由于该迭代器返回一个引用,并且即使迭代器未失效,您也可以不必担心

auto& element = m_Map[key];
element = value;
// use element

第二种选择:您可以使用从返回的迭代器(如果需要检查元素是否存在,则为最佳选择)

只需保留对刚刚插入的对象的引用:

T& reference = map[key];
reference = value;
如果您正在处理一个高性能应用程序,您可能不想使用
操作符[]()
,因为它是第一个默认的构造和对象(而且您可能也不想使用
std::map
,而是
std::无序映射
)。相反,您需要
emplace()
对象并保持迭代器从此操作返回,例如:

std::unordered_map<K, V>::iterator it = map.emplace(key, value).first;
it->second = other_value;
std::无序映射::迭代器it=map.emplace(key,value);
it->second=其他_值;

只需保留对刚刚插入的对象的引用:

T& reference = map[key];
reference = value;
如果您正在处理一个高性能应用程序,您可能不想使用
操作符[]()
,因为它是第一个默认的构造和对象(而且您可能也不想使用
std::map
,而是
std::无序映射
)。相反,您需要
emplace()
对象并保持迭代器从此操作返回,例如:

std::unordered_map<K, V>::iterator it = map.emplace(key, value).first;
it->second = other_value;
std::无序映射::迭代器it=map.emplace(key,value);
it->second=其他_值;

无需将捕获引用与分配分开。。。可以是一行,除非您感到困惑或认为其他人可能:

value_type& ref = m_Map[key] = value;

没有特别需要将捕获引用与分配分开。。。可以是一行,除非您感到困惑或认为其他人可能:

value_type& ref = m_Map[key] = value;

为什么要避免查找?我正在处理一个性能非常关键的应用程序。好吧,我也在HPC领域工作,但是:-过早优化是万恶之源-优化作为第二步,并使用探查器跟踪缓慢的部分,这就是你需要优化的地方为什么你要避免
查找
?我在一个性能非常关键的应用程序上工作。很好,我也在HPC领域工作,但是:-过早优化是万恶之源-优化是第二步,并使用探查器跟踪缓慢的部分,那是你需要做的,谢谢!这就是我想的,但不确定是否有“更好”或更常见的方法…@Andrew:如果“性能非常关键”,您肯定不想使用这种方法,因为在使用
操作符[]()
插入地图时,存在不必要的默认构造对象!您可以使用
emplace()
捕获迭代器并从该迭代器获取引用。@DietmarKühl,这取决于数据类型。。。对于许多人来说,效率低下应该由乐观主义者来消除,但这肯定是一个很好的观点,值得检查,如果数据类型不是一成不变的话,你的建议是最好的。@TonyD:考虑到map实现肯定需要以某种方式添加对象,我非常肯定
emplace()的使用
插入元素并获取位置决不会比使用下标运算符慢,但通常更快。也就是说,我还没有一个基准来证明典型密钥类型的正确性。谢谢!这就是我想的,但不确定是否有“更好”或更常见的方法…@Andrew:如果“性能非常关键”,您肯定不想使用这种方法,因为在使用
操作符[]()
插入地图时,存在不必要的默认构造对象!您可以使用
emplace()
捕获迭代器并从该迭代器获取引用。@DietmarKühl,这取决于数据类型。。。对于许多人来说,效率低下应该由乐观主义者来消除,但这肯定是一个很好的观点,值得检查,如果数据类型不是一成不变的话,你的建议是最好的。@TonyD:考虑到map实现肯定需要以某种方式添加对象,我非常肯定
emplace()的使用
插入元素并获取位置决不会比使用下标运算符慢,但通常更快。也就是说,我还没有一个基准来证明典型键类型的观点。