vector push_back over std::copy
vector push_back over std::copy
我有一个函数,它有一个无序集作为参数。由于我使用openmp,所以我将这个无序集转换为向量。我使用std::副本进行转换。
//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是一项成本高昂的操作。所以我认为,如果我创建一个类变量向量,并在更新集合时不断填充这个向量,我就可以完全避免这种std::copy操作。由于向量的推回运算的时间复杂度被分摊为O(1)。你有什么建议?
std::back_insert_iterator
调用std::vector::push_back
,所以您的提案没有任何改进。
重要的是,您事先就知道v1
的大小,因此请利用该信息并使std::vector
只分配其存储一次以避免std::push_back
在v1.size() == v1.capacity()
时重新分配。
这样做:
std::vector<T> v1;
v1.reserve(s1.size());
std::copy(s1.begin(), s2.end(), std::back_inserter(v1));
或者这个:
std::vector<T> v1(s1.size());
std::copy(s1.begin(), s2.end(), v1.begin());
或者,正如@CoryKramer所建议的,习惯性地从一个范围构建v1
:
std::vector<T> v1(s1.begin(), s1.end());
更新:
所有三个版本都执行T
的s1.size()
份数。然而,当在具有T = int
的10^7
元素的GCC上进行测量时,结果表明std::vector::reserve
是最快的方法(因为ForwardIterator的std::distance
具有线性复杂度,而std::unordered_set::size
具有>常数)。当处理更少和非常大的对象时,这种差异会减少,但它仍然存在。
第二种方法只比第一种稍微慢一点,因为初始化元素的值。
结论:使用std::vector::reserve
。
您可以使用以下功能来提高性能:
func( std::unorderedset s1)
begin
vector v1;
v1.reserve(s1.size()); // HERE
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() 收到运行时错误(分段错误)?
- std::copy 导致运行时检查失败 #2
- 对于输出,std::copy是否比std::cout快
- std::copy,std::copy_backward和重叠范围
- 在结构数组上使用 c++ std::copy
- Std::copy 和 std::ostream_iterator 使用重载函数打印值
- 从 std::copy 和 std::copy_n 中提取输入迭代器
- 如何使用 std::copy 打印用户定义的类型
- Using `std::copy()` with `std::back_inserter()`
- 可以使用 std::copy 将 3D 数组复制到矢量
- 为什么在 std::copy 中使用 std::back_inserter 而不是 end()
- 如何将unique_ptr与 std::copy 一起使用
- 为什么 std::move 的行为类似于 std::copy
- 如何使用 std::copy 将一个 constexpr 数组复制到另一个 constexpr 数组
- 为什么在我的测试程序中,从字符缓冲区读取一个int时,"std::copy"5x(!)比"
- 使用back_inserter()或inserter()提高std::copy()的效率
- 用memcopy、memmove或std:copy替换For循环
- 在不使用 std::copy 函数的情况下编写这个复杂的复制结构体
- std::copy 将双精度数组复制到浮点数数组
- 编译器减少 std::copy to memcpy (memmove) 的条件是什么?