【发布时间】:2016-04-03 08:33:10
【问题描述】:
我有一个函数,它有一个无序集作为参数。由于我使用的是 openmp,因此我将这个无序集转换为 vector 。我使用 std::copy 进行此转换。
//pseudo code
func( std::unorderedset s1)
begin
vector v1;
std::copy(s1.begin,s2.end,std::back_inserter(v1.end());
#openmp scope
for( i = 0 ; i < v1.size(); i++ )
{
//accessing v1(i)
}
end
但是我觉得 std::copy 是一项昂贵的操作。所以我的想法是,如果我创建一个类变量向量并在更新我的 set 时继续填充这个向量,我可以完全避免这个 std::copy operation 。由于向量的 push_back 操作的时间复杂度被摊销 O(1)。你有什么建议?
【问题讨论】:
-
另请注意,您可以直接将向量构造为
vector v1(s1.begin(), s1.end());,因为构造函数的重载需要两个迭代器 -
@CoryKramer 但它会再次涉及会员副本。我的意思是它会比 std::copy 快吗?
-
如果在填充
unorderedset之前不需要使用向量,我认为并行填充它们是没有用的。最好在填充之前正确reserve向量。您的方法不会这样做,但可以轻松更改为。我很确定 CoryKramer 建议的版本确实在填充之前正确保留。 -
除了有感觉之外,你能证明你声称
std::copy()很贵的说法吗?std::push_back()可能是 O(1),但添加n元素(比如说,在循环中)是O(n),所以你在这里描述的推理是有缺陷的。 -
@sameerkarjatkar:将数据从
std::unorderd_set获取到std::vector始终是 O(n) 操作。您可以使用reserve对其进行改进。请注意,带有back_inserter_iterator的std::copy只是一个push_back循环。自己编写循环并不昂贵。
标签: c++ vector openmp push-back