最終更新日時(UTC):
が更新

履歴 編集

function template
<algorithm>

std::ranges::swap_ranges(C++20)

namespace std::ranges {
  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2>
    requires indirectly_swappable<I1, I2>
  constexpr swap_ranges_result<I1, I2> swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2);                   // (1)

  template<input_range R1, input_range R2>
    requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>>
  constexpr swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> swap_ranges(R1&& r1, R2&& r2); // (2)
}

概要

指定された2つの範囲同士を swap する。

  • (1): イテレータペアで範囲を指定する
  • (2): 範囲を直接指定する

効果

0 以上 last1 - first1 以下のそれぞれの n について swap(*(first1 + n), *(first2 + n)) を行う

事前条件

[first1,last1)[first2,first2 + (last1 - first1)) の範囲が重なってはならない。 0 以上 last1 - first1 未満のそれぞれの n について、*(first1 + n) と *(first2 + n)Swappable でなければならない。

戻り値

swap_ranges_result {
  .in1 = first1 + M,
  .in2 = first2 + M,
}

ただし、M =min(last1 - first1, last2 - first2) とする。

計算量

正確に last1 - first1 回のスワップが行われる

#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>

int main() {
  std::vector<int> v1 = { 3,1,2 };
  std::vector<int> v2 = { 5,2,4,1,3 };

  std::ranges::swap_ranges(v1, v2);

  std::cout << "v1: ";
  std::ranges::copy(v1, std::ostream_iterator<int>(std::cout, ","));
  std::cout << std::endl;

  std::cout << "v2: ";
  std::ranges::copy(v2, std::ostream_iterator<int>(std::cout, ","));
  std::cout << std::endl;
}

出力

v1: 5,2,4,
v2: 3,1,2,1,3,

バージョン

言語

  • C++20

処理系

参照