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

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

ただいまの
回答率

90.51%

  • C++

    4426questions

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

c++におけるコンテナの使い方

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 761

eTakahiro

score 2

ベクトルコンテナに整数を格納していき、最初と最後の5つを表示した後に昇順にソートしてまた最初と最後の5つを表示したいのですが、実行時にエラーが出てしまいました。
コンテナの概念がまだよくわかっていないので、教えていただけたら嬉しいです。

#include<iostream>
#include<vector>
using namespace std;

void sort_input(vector<int> *a){
    vector<int>::size_type t, u;
    vector<int> temp;
    for (t = 0; t < a->size(); t++){
        for (u = a->size() - 1; u > t - 1; u++){
            if (a[u] < a[u - 1]){
                temp = a[u];
                a[u] = a[u - 1];
                a[u - 1] = temp;
            }
        }
    }
}

int main(void)
{
    int input;
    vector <int> iv;
    do {
        cin >> input;
        iv.push_back(input);
    } while (input > 0);
    vector<int>::size_type s;
    cout << "\n\n";
    for (s = 0; s <5; s++) {
        cout << iv[s] << endl;
    }
    cout << "\n\n";
    for (s = iv.size() - 5; s < iv.size(); s++){
        cout << iv[s] << endl;
    }
    cout << "\n\n";
    sort_input(&iv);
    for (s = 0; s <5; s++) {
        cout << iv[s] << endl;
    }
    cout << "\n\n";
    for (s = iv.size() - 5; s < iv.size(); s++){
        cout << iv[s] << endl;
    }

    return 0;
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

コンテナの概念がまだよくわかっていないので、教えていただけたら嬉しいです。

C++標準ライブラリが提供するコンテナは「実行時にその要素を追加/削除できるデータ構造」です。

その中でも一番利用頻度が高いのがstd::vectorでしょう。こちらは「実行時に要素を追加/削除できる可変長配列」と捉えればOKです。

直接的な問題は、void sort_input(vector<int>* a)関数内でa[n]とアクセスした場合、「vectorのn番目の要素」ではなく、「"vectorの配列"があったとして、そのn番目のvector」になってしまいます。そのようなデータ領域は存在しないため、プログラムは実行時にクラッシュします。

修正方法としては、A)関数引数を参照型vector<int>& aとするか、B)要素アクセス時にa->at(n)に変更する必要があります。C++プログラムの設計としてはA)の方が自然だと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 18:21

    なるほど...
    ありがとうございます。やってみます。

    キャンセル

  • 2016/11/11 18:44

    void sort_input(vector<int> &a){
    vector<int>::size_type t, u;
    int temp;
    for (t = 0; t < a.size(); t++){
    for (u = a.size() - 1; u > t - 1; u--){
    if (a[u] > a[u - 1]){
    temp = a[u];
    a[u] = a[u - 1];
    a[u - 1] = temp;
    }
    }
    }
    }
    できました!
    tempもint型にしました。先ほどはなぜtempをint型にしたらビルド時に型が違うとエラーが出たのか謎です。

    キャンセル

  • 2016/11/11 23:06

    参考までに:
    (学習目的でなければ)C++標準ライブラリで std::sort 関数が提供されますから、通常のソート処理ではそちらを使った方が良いですね。

    キャンセル

0

エラー内容が書かれていないので想像ですが、
このコードだと入力回数が5回未満だと、下記のコードでマイナスの値が添字に使われてしまいます。
(iv[-1] みたいな)

for (s = iv.size() - 5; s < iv.size(); s++){
    cout << iv[s] << endl;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 18:11

    エラーというか動作を停止してしまいます。ソート関数の前までは表示されていました。
    確かに5回未満だと要素がマイナスになってしまいますね。。
    終了条件はwhile(input>0)なのでたぶん大丈夫ではないですか??

    キャンセル

  • 2016/11/11 18:16

    あぁ多分これですかね
    for (u = a->size() - 1; u > t - 1; u++){

    多分これ「u--」ですよね。
    あんまり頭働かせてないので自信ないですが

    キャンセル

  • 2016/11/11 18:23

    あ、確かにそうでした。すいませんm(_ _)m

    キャンセル

  • 2016/11/11 18:29 編集

    本当にすいません、頭働かせてないにも程がありました。(u--にしろとか完全に見当違いですので忘れてください)
    今まで全然見当違いの事を言っていました。
    yohhoy様の言っている事が全部ですね。

    a[u] ← これはint型をさしています。
    a[u] = 1; // これなら入る
    でもコードよく見たら
    a[u] = temp // tempはvector<int>型
    これは入りません

    vector<int> temp;

    int temp;

    に書き直してください。

    キャンセル

  • 2016/11/11 18:45

    int型にしたらできました!ありがとうございます。

    キャンセル

0

void sort_input(vector<int> *a){

まず、sort_input関数へのvectorオブジェクトの渡し方に誤りがあります。ポインタ渡しではなく参照で渡してください。ポインタで渡しているため、まったく見当違いの処理になってしまい、アクセス違反が発生しているものと思われます。
参照渡しは&aと書きます。参照渡しした変数は通常の変数と同様a.size()のようにピリオドでメンバを指定してください。
C++では、ポインタ渡しでなければ困る理由がない限り、参照渡しにしてください。

変数tempvectorではなく、配列の要素であるint型で定義してください(引数をポインタ渡しにしているためおかしなことになっています)。

それと、バブルソートだと思いますが、ソートのアルゴリズムが正しく実装されていません。

for (t = 0; t < a->size(); t++){

二つの値を比較しながらループを進めるため、外側のループは、最後の要素の1個手前になるようにします。t < a.size() - 1としてください。

for(u = a->size() - 1; u > t - 1; u++)

ループの中の処理からすると、後ろから進めてutの一つ後ろになるまでループさせたいので、終了条件に- 1は不要でu > tとしてください。そして、前方向にインデックスを進めるので`u--'としないといけません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 19:00

    ポインタ渡しだとよくないというのはコンテナだからなのですか?構造体の時は問題なかったのですが、そういうのもやはりc++では参照渡しを使ったほうがいいのですか??
    ソートのところもだいぶ間違ってましたね汗
    ちゃんとやろうと思います。ありがとうございます。

    キャンセル

  • 2016/11/11 19:20

    ポインタ渡しにすべきでないのは、コンテナに限らず、intやdoubleなどの組み込み型も含めた全てのオブジェクトです。構造体の時に問題がなかったのは、たまたまです。今回の問題もポインタに起因していますが、それはクラスだからというものではありません。

    このように、ポインタにするとそれにまつわる問題に対処する必要が出てきて、本来の処理とは違うところにコストを掛けることになりますから、本当にポインタでなければ困るような特別な事情がない限りは参照渡しにしてください。
    それに、メンバ変数・関数を呼ぶ際の書き方が通常の変数と異なるのは統一感がなくて見栄えが悪いです。

    キャンセル

  • 2016/11/11 19:28

    ポインタがやっかいなものだとは知りませんでした。確かに見栄えも悪いですね。
    これからは参照渡しを使っていこうと思います。ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • C++

    4426questions

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