std::swap与std::iter_swap 交换元素

std::swap

std::swap 用于交换2个元素,g++源码如下

  /**
   *  @brief Swaps two values.
   *  @param  __a  A thing of arbitrary type.
   *  @param  __b  Another thing of arbitrary type.
   *  @return   Nothing.
  */
  template<typename _Tp>
    inline void
    swap(_Tp& __a, _Tp& __b)
#if __cplusplus >= 201103L
    noexcept(__and_<is_nothrow_move_constructible<_Tp>,
                is_nothrow_move_assignable<_Tp>>::value)
#endif
    {
      // concept requirements
      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)

      _Tp __tmp = _GLIBCXX_MOVE(__a);
      __a = _GLIBCXX_MOVE(__b);
      __b = _GLIBCXX_MOVE(__tmp);
    }

#define _GLIBCXX_MOVE(__val) std::move(__val)

_GLIBCXX_MOVE()宏实际上是std::move。因此,swap核心代码相当于:

template<typename Tp>
inline void swap(Tp& a, Tp& b)
{
    Tp tmp = std::move(a);
    a = std::move(b);
    b = std::move(tmp);
}

也就是说,通过一个临时变量tmp,交换a、b的值。

iter_swap

iter_swap用于交换2个迭代器所指元素。g++源码如下

template <class ForwardIterator1, class ForwardIterator2>
inline void iter_swap (ForwardIterator1 a, ForwardIterator2 b)
{
    swap (*a, *b);
}

也就是说,iter_swap的参数,应该是一个迭代器,交换的是迭代器(包括指针)多指向的元素。而iter_swap本身也是利用swap来实现的。

应用示例

利用std::swap, std::iter_swap交换a、b两个元素:

int a = 10, b = 20;

std::swap(a, b);
cout << "a = " << a << ", b = " << b << endl; // 打印 a = 20, b = 10

std::iter_swap(&a, &b);
cout << "a = " << a << ", b = " << b << endl; // 打印 a = 10, b = 20

交换容器中的数据:

vector<string> svec = {"A", "B", "C"};
for_each(svec.begin(), svec.end(), [](const string& str){cout << str;}); // 打印"ABC"
cout << endl;

std::swap(svec[0], svec[2]); // 交换元素svec[0]和svec[2]
for_each(svec.begin(), svec.end(), [](const string& str){cout << str;}); // 打印"CBA"
cout << endl;

std::iter_swap(svec.begin(), svec.begin() + 2); // 交换svec.begin()和svec.begin()+2所指元素
for_each(svec.begin(), svec.end(), [](const string& str){cout << str;}); // 打印"ABC"
cout << endl;

参考

http://www.cplusplus.com/reference/algorithm/iter_swap/
https://blog.csdn.net/zqw_yaomin/article/details/81278948

posted @ 2022-04-07 22:47  明明1109  阅读(397)  评论(0编辑  收藏  举报