最終更新日時(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) C++20

  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) C++20
}

概要

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

効果

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

事前条件

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

戻り値

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

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

計算量

正確に min(last1 - first1, last2 - first2) 回のスワップが行われる

#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

処理系

参照