std::swap與std::iter_swap 交換元素
阿新 • • 發佈:2022-04-08
目錄
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