質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

7520閲覧

C++ 昇順でlistに入った数字を並び替える

big000

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/17 18:03

コンソールから正の整数を入力すると、それまで入力した数値が、小さい順に並べ替えて表示されるようなプログラムを作りなさい。-1が入力されたら、プログラムは終了するものとする。なお、それまで入力され続けていた数値は、listに格納し、適切な場所に挿入するようにすること。

という問題。。。

自分の書いたコード。。

#include<iostream> #include<list> #include<string> using namespace std; int main() { int n = 0; int temp; list <int> li; while (n != -1) { cout << "正の整数を入力"; cin >> n; if (n == -1)break; li.push_back(n); } list<int>::iterator i1; list<int>::iterator j; for (i1 = li.begin(); i1 != li.end()--; i1++) { for (j = ++i1; j != li.end(); j++) { if (*i1 > * j) { temp = *i1; *i1 = *j; *j = temp; } } } for (i1 = li.begin(); i1 != li.end(); i1++) { cout << *i1 << ""; } }

昇順に並び替える方法は、以下のサイトなどを参照した。
https://webkaru.net/clang/array-sort-ascending-order/

コードに関しては、実行画面で、
[Expression:cannot increment end list iterator]
というエラーが出た。
コード自体にはエラーは無かった。

インクリメントで、どこがおかしいのか、わからなかったため、わかる方、ご教授ください。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

C++

1#include <iostream> 2#include <list> 3#include <string> 4 5int main() { 6 using namespace std; 7 8 int n = 0; 9 list <int> li; 10 11 while ( true ) { 12 cout << "正の整数を入力"; 13 cin >> n; 14 if (n == -1) break; 15 li.push_back(n); 16 } 17 18 li.sort(); // こんだけ。 19 20 for ( int item : li ) { 21 cout << item << " "; 22 } 23}

投稿2019/06/17 18:25

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

big000

2019/06/17 18:30

解答ありがとうございました。 私が書いたコードで、誤ってる点はありますか。
episteme

2019/06/17 19:34

> for (i1 = li.begin(); i1 != li.end()--; i1++) li.end()-- ってなんだ? i1 != prev(li.end()) のマチガイか?
majiponi

2019/06/17 23:32

内側のループでjを初期化するときに、i1をインクリメントしてるのがまずい。
guest

0

C++

1 list<int>::iterator i1; 2 list<int>::iterator j; 3 for (i1 = li.begin(); i1 != li.end()--; i1++) { 4 for (j = ++i1; j != li.end(); j++) {

この部分を次のように変えるとエラーになりません。

C++

1 list<int>::iterator i1, j, end = li.end(); 2 for (--end, i1 = li.begin(); i1 != end; ++i1) { 3 for (j = i1; ++j != li.end(); ) {

しかし、この for文によるソートは選択ソートです。
課題は、挿入ソートを実装しなさいというものです。

C++

1#include<iostream> 2#include<list> 3 4using namespace std; 5 6int main() 7{ 8 list <int> li; 9 while (true) { 10 cout << "正の整数を入力 "; 11 int n; 12 cin >> n; 13 if (!cin || n < 0) break; 14 15 list<int>::iterator i1; 16 for (i1 = li.begin(); i1 != li.end(); ++i1) 17 if (n < *i1) break; 18 li.insert(i1, n); 19 for (i1 = li.begin(); i1 != li.end(); ++i1) 20 cout << " " << *i1; 21 cout << endl; 22 } 23}

投稿2019/06/18 02:59

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

適切な場所に挿入するようにすること

という文言から,題意的には,
「適当にlistにpush_backしておいて最後に1回ソートすればいいよね」という形ではなくて,
「listに各要素を入れる際に毎度入れるべき箇所に入れろ」という指定がなされているように思える.

std::list<int> li; { while(true) { int n = -1; std::cin >> n; if (n == -1)break; //「適切な場所に挿入」ってのはこういうのを書けってことでは? li.insert( std::find_if( li.begin(), li.end(), [n](int v){ return (v>=n); } ), n ); } } //whileを抜けた時点で,昇順に並んでいる for( int v : li ){ std::cout << v << " "; } return 0;

投稿2019/06/18 01:22

fana

総合スコア11656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2019/06/18 10:25

li.insert(std::upper_bouond(li.begin(), li.end(), n), n); の方が多分速い♪
fana

2019/06/18 22:33

常にソートされてるわけだから,2分探索が使えるということですね.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問