バブルソートを実装しています。
現時点のイテレータit
とその隣std::next(it)
を比較して、*it
が大きかったときに両者の値をスワップしたいのですが、std::iter_swap(it, std::next(it));
の部分でエラーになります。
どうすれば良いでしょうか?
C++
1// https://wandbox.org/permlink/N2uAw06AuHjUOlDw 2#include <algorithm> 3#include <functional> 4#include <iostream> 5#include <iterator> 6#include <vector> 7using Iterator = std::vector<int>::const_iterator; 8 9void BubbleSort(Iterator begin, Iterator end) { 10 while (true) { 11 auto it = begin; 12 auto is_swapped = false; 13 14 while (it != end) { 15 if (*it > *std::next(it)) { 16 std::iter_swap(it, std::next(it)); 17 is_swapped = true; 18 } 19 ++it; 20 } 21 22 if (is_swapped) { 23 break; 24 } 25 } 26} 27 28int main() { 29 std::vector<int> v = {3, 1, 4, 5, 2}; 30 BubbleSort(std::begin(v), std::end(v)); 31 32 for (const auto &i : v) { 33 std::cout << i << ", "; 34 } 35 std::cout << "\n"; 36}
解決後追記
ソートの実装そのものにも誤りがあったので、正しく機能するもののコードを残しておきます。
C++
1https://wandbox.org/permlink/FpGavGk9jUIKGQkk 2#include <algorithm> 3#include <functional> 4#include <iostream> 5#include <iterator> 6#include <vector> 7using Iterator = std::vector<int>::iterator; 8 9void BubbleSort(Iterator begin, Iterator end) { 10 while (true) { 11 auto it = begin; 12 auto is_swapped = false; 13 14 while (std::next(it) != end) { 15 if (*it > *std::next(it)) { 16 std::iter_swap(it, std::next(it)); 17 is_swapped = true; 18 } 19 ++it; 20 } 21 22 if (!is_swapped) { 23 break; 24 } 25 } 26} 27 28int main() { 29 std::vector<int> v = {3, 1, 4, 5, 2}; 30 BubbleSort(std::begin(v), std::end(v)); 31 32 for (const auto &i : v) { 33 std::cout << i << ", "; 34 } 35 std::cout << "\n"; 36} 37
template<typename Iterator>
void BubbleSort(Iterator begin, Iterator end)
でいぃんじゃね?
回答1件
あなたの回答
tips
プレビュー