C++でvectorを反転します
この投稿では、C++でvectorを反転する方法について説明します。
1.使用する std::reverse
関数
最も簡単な解決策は、 std::reverse
で定義された関数 <algorithm>
ヘッダ。この関数は内部で使用します std::iter_swap
指定された範囲の両端から要素を交換します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> #include <vector> #include <algorithm> template <typename T> std::ostream &operator<<(std::ostream &os, const std::vector<T> &v) { for (T const &i: v) { os << i << " "; } return os; } int main() { std::vector<int> v = { 1, 2, 3, 4, 5 }; std::cout << "Original Vector: " << v << std::endl; std::reverse(v.begin(), v.end()); std::cout << "Reversed Vector: " << v << std::endl; return 0; } |
出力:
Original Vector: 1 2 3 4 5
Reversed Vector: 5 4 3 2 1
2.リバースイテレータの使用
ここでの考え方は、逆反復子を使用して、範囲コンストラクターを使用して新しいvectorを作成することです。次に、元のvectorを新しいvectorと単純に交換できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <vector> #include <algorithm> template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T> &v) { for (T const& i: v) { os << i << " "; } return os; } int main() { std::vector<int> v = { 1, 2, 3, 4, 5 }; std::cout << "Original Vector: " << v << std::endl; std::vector<int> r(v.rbegin(), v.rend()); v.swap(r); //または、 `v=r`を呼び出します std::cout << "Reversed Vector: " << v << std::endl; return 0; } |
3.使用する std::swap
関数
私たちはそれを見てきました std::reverse
機能は内部的に使用します std::iter_swap
関数。同じことは、の助けを借りて達成することができます std::swap
以下に示すように、関数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> #include <vector> #include <algorithm> template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T> &v) { for (T const& i: v) { os << i << " "; } return os; } int main() { std::vector<int> v = { 1, 2, 3, 4, 5 }; std::cout << "Original Vector: " << v << std::endl; for (auto start = v.begin(), end = std::prev(v.end()); start < end; ++start, --end) { std::swap(*start, *end); } std::cout << "Reversed Vector: " << v << std::endl; return 0; } |
4.使用する std::transform
関数
最後に、別の良い解決策は、 std::transform 以下に示すように、アルゴリズム:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <iostream> #include <vector> #include <algorithm> template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T> &v) { for (T const& i: v) { os << i << " "; } return os; } int main() { std::vector<int> v = { 1, 2, 3, 4, 5 }; std::cout << "Original Vector: " << v << std::endl; auto mid = v.begin() + v.size()/2; std::transform(v.begin(), mid, v.rbegin(), v.begin(), [](int &x, int &y) { std::swap(x, y); return x; }); std::cout << "Reversed Vector: " << v << std::endl; return 0; } |
これで、C++でvectorを逆にすることができます。
こちらも参照: