gpt4 book ai didi

c++ - 在 vector 之间使用 std::swap 还是 vector::swap?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:07 30 4
gpt4 key购买 nike

给定两个 std::vector v1, v2。
我想知道使用 std::swap(v1, v2) 比 v1.swap(v2) 有什么好处。

我已经实现了一个关于性能观点的简单测试代码(我不确定它是否相关):

#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <algorithm>

#define N 100000

template<typename TimeT = std::chrono::microseconds>
struct Timer
{
template<typename F, typename ...Args>
static typename TimeT::rep exec(F func, Args&&... args)
{
auto start = std::chrono::steady_clock::now();
func(std::forward<Args>(args)...);
auto duration = std::chrono::duration_cast<TimeT>(std::chrono::steady_clock::now() - start);
return duration.count();
}
};

void test_std_swap(std::vector<double>& v1, std::vector<double>& v2)
{
for (int i = 0; i < N; i ++)
{
std::swap(v1,v2);
std::swap(v2,v1);
}
}

void test_swap_vector(std::vector<double>& v1, std::vector<double>& v2)
{
for (int i = 0; i < N; i ++)
{
v1.swap(v2);
v2.swap(v1);
}
}

int main()
{
std::vector<double> A(1000);
std::generate( A.begin(), A.end(), [&]() { return std::rand(); } );
std::vector<double> B(1000);
std::generate( B.begin(), B.end(), [&]() { return std::rand(); } );
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_std_swap, A, B) << std::endl;
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_swap_vector, A, B) << std::endl;
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_std_swap, A, B) << std::endl;
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_swap_vector, A, B) << std::endl;
}

根据输出,似乎 vector::swap 在没有优化的情况下似乎更快 -O0。输出是(以微秒为单位):

20292
16246
16400
13898

-O3 没有相关差异。

752
752
752
760

最佳答案

假设一个合理的实现,这两个函数应该以相同的方式实现。因此,您应该使用代码中最易读的内容。

特别是,如果我们查看 std::swap(vector<T> & x, vector<T> & y) 的描述,它的效果是x.swap(y) .

关于c++ - 在 vector 之间使用 std::swap 还是 vector::swap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27691451/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com