【问题标题】:Efficiency of std::tuple and std::mapstd::tuple 和 std::map 的效率
【发布时间】:2013-11-22 14:50:45
【问题描述】:

我目前正在构建一个程序,该程序依赖于多个向量和地图来保留以前计算的信息。我的矢量是标准格式的,不是很有趣。地图的形式是

std::map<std::string, long double> 

字符串的意图是一个向量到另一个向量的可解析映射,例如

std::map<std::string, long double> rmMap("fvProperty --> fvTime", 3.0234);

稍后我可以在其中拆分字符串并将子字符串与向量名称进行比较,以找出哪些参与了获取数字。 但是,我最近发现 std::tuple 是可用的,这意味着我可以完全跳过字符串并使用向量位置来代替

std::tuple<unsigned int, unsigned int, long double>

这允许我(据我所知)使用第一个和第二个值作为键,这似乎比为我的索引解析字符串更可取。

我的症结是我不知道这里的效率。将有大量调用这些元组/映射,并且效率至关重要,因为该程序预计在产生最终结果之前运行数周。

因此,我想问你,在处理大型计算密集型程序时,元组是否比映射更有效或同等有效(在内存、缓存和循环方面)。

编辑: 如果不能以这种方式使用元组,地图会不会

std::map<std::pair<unsigned int, unsigned int>, long double>

可以有效替代使用字符串进行标识吗?

【问题讨论】:

  • 元组不能替代地图;它只是一个具有(在这种情况下)三个数据成员的简单结构。如果你想使用两个值作为映射键,你会想要像map&lt;pair&lt;int,int&gt;,double&gt; 这样的东西。您可能会也可能不会发现 unordered_mapmap 更高效,具体取决于您正在使用它们做什么。
  • 当然,您必须提供合适的比较功能,以便map 可以正确排序。或者,如果您不需要有序映射,可以使用unordered_map 并提供适当的散列函数。
  • @MikeSeymour:我们互相打过去。 :-) 您编辑了您的评论,几乎说出了我在您的评论中添加的内容。
  • 我想最好写一个小测试应用程序看看你的速度比较如何?要我写一个吗?
  • 你打算以后如何访问这个结构?遍历整个事情?主要通过两个向量索引进行查询?通过向量索引之一?您的答案将决定正确的结构。

标签: c++ optimization maps tuples


【解决方案1】:

映射的优点是可以有效地查询与键关联的数据。

它不能与只是将值打包在一起的元组进行比较:您必须自己遍历元组才能检索到正确的值。

按照 Mike 的建议使用 map&lt;pair&lt;unsigned int, unsigned int&gt;, long double&gt; 可能是可行的方法。

【讨论】:

  • 那我试试这个。希望它会比我目前正在做的更快。谢谢。
【解决方案2】:

元组和地图用于非常不同的目的。所以它应该主要是关于你想用它们做什么,而不是它们的效率。用螺丝刀打开汽车会有些麻烦,因为您将尝试用车钥匙固定螺丝。我建议反对这两种方法。

元组是 一个 小数据集,在您的情况下,例如集合{1,2,3.0234}。映射用于将多个键映射到它们的值。实际上,映射内部由多个元组(对)组成,每个元组都包含一个键和关联的值。在地图内部,这些对的排列方式便于搜索键。

在您的情况下,我更喜欢您的编辑建议的map&lt;pair&lt;int, int&gt;, double&gt;。键(即向量索引对)比那些字符串更容易搜索和“解析”。

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2019-06-15
    • 2012-10-12
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多