在vector或vector :: swap之间使用std :: swap?

coi*_*oin 5 c++ swap vector c++11

给出两个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;
}
Run Code Online (Sandbox Code Playgroud)

根据输出,似乎vector :: swap似乎更快,没有优化-O0.输出是(以微秒为单位):

20292
16246
16400
13898
Run Code Online (Sandbox Code Playgroud)

-O3没有任何差异.

752
752
752
760
Run Code Online (Sandbox Code Playgroud)

Bil*_*nch 10

假设一个理智的实现,这两个函数应该相同地实现.因此,您应该使用代码中最易读的内容.

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


Die*_*ühl 7

在任何情况下都不应该std::swap()直接使用!相反,你应该使用这样的东西:

using std::swap;
swap(x, y);
Run Code Online (Sandbox Code Playgroud)

因为std::vector<...>std::vector<...>显然没有区别,因为显然存在于命名空间中std.否则关键的区别在于使用std::swap()默认实现正在使用,而使用ADL概述的方法可以找到更好的版本.

使用swap(x, y)std::vector<...>小号xy会只是调用x.swap(y).为了与其他用途保持一致,我将使用上面列出的方法.

  • 直接使用std :: swap()有什么问题? (20认同)
  • @coincoin:没有优化的C++代码分析是徒劳的!例如,对所有内容进行简单内联的函数调用会增加成本.由于生产代码肯定总是使用优化,因此未优化代码的性能也无关紧要. (4认同)