1. 程式人生 > 其它 >std::swap與std::iter_swap 交換元素

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