【发布时间】: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<pair<int,int>,double>这样的东西。您可能会也可能不会发现unordered_map比map更高效,具体取决于您正在使用它们做什么。 -
当然,您必须提供合适的比较功能,以便
map可以正确排序。或者,如果您不需要有序映射,可以使用unordered_map并提供适当的散列函数。 -
@MikeSeymour:我们互相打过去。 :-) 您编辑了您的评论,几乎说出了我在您的评论中添加的内容。
-
我想最好写一个小测试应用程序看看你的速度比较如何?要我写一个吗?
-
你打算以后如何访问这个结构?遍历整个事情?主要通过两个向量索引进行查询?通过向量索引之一?您的答案将决定正确的结构。
标签: c++ optimization maps tuples