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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2864閲覧

C++ 配列の宣言の仕方によってsortがエラーを起こす

amazing

総合スコア2

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/20 04:38

配列の宣言の仕方とsortとの表記の仕方によってエラーが起きます。以下にいくつかの例を挙げます。なぜうまくいいったり、いかなったりするのか分かる方がいたら教えていただきたいです。

c++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int n; 6 cin >> n; 7 int a[n]; 8 for(int i=0;i<n;i++){ 9 cin >> a[i]; 10 } 11 sort(a.begin(),a.end()); 12........ 13} 14

この場合だと以下のエラーが出る。

c++

1./Main.cpp: In function ‘int main(): 2./Main.cpp:11:10: error: request for member ‘begin’ in ‘a’, which is of non-class type ‘int [n]3 11 | sort(a.begin(),a.end()); 4 | ^~~~~ 5./Main.cpp:11:20: error: request for member ‘end’ in ‘a’, which is of non-class type ‘int [n]6 11 | sort(a.begin(),a.end()); 7 | ^~~

この場合、配列の宣言を
vector<int> a;
とすると、コンパイルに問題はないが実行時エラーが出る。

また、配列の宣言を
vector<int> a(n);
とするとうまくいく。

また、配列の宣言は最初のままで、sortを
sort(a,a+n);
とするとうまくいく。このsortの使い方も調べてもなかなか出てこなかったので、何を意味しているのか教えていただけたら幸いです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

配列はメンバ関数を持ちません。 a.begin()a.end()などというものは存在しないので呼べないと言ってます。

vector<int> a; と宣言するとその a の大きさはゼロです。 cin >> a[i]; としたときの a[i] は存在しない場所なのでそこに書き込むのは未定義の挙動となります。

beginend で返されるイテレータというのは要するに「最初の要素を指すもの」と「最後の要素を超えた場所を指すもの」です。 a が配列であるとき単に a と書くと暗黙の型変換によって最初の場所を指すポインタになります。 なので a は「最初の要素を指すもの」です。 a+n はポインタに配列の大きさを加算しているので最後の要素を超えた場所を指しています。

投稿2020/06/20 04:46

SaitoAtsushi

総合スコア5675

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

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

amazing

2020/06/20 05:17

とても分かりやすかったです、ありがとうございました!!
guest

0

普通の配列(C形式の配列)にはメンバ関数beginがないからです。

c++

1sort(std::begin(a), std::end(a));

を使うとよいです。

投稿2020/06/20 04:47

asm

総合スコア15149

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

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

amazing

2020/06/20 05:12

なるほどです、逆にvectorを使って宣言するとメンバ関数を持つということですね!
guest

0

vector<int> a;←初期化(領域は確保されない)
vector<int> a(n);←領域を確保して初期化
sort(a,a+n)←vectorの先頭から最後(a+n-1)までをソート
参考:std::sort

投稿2020/06/20 04:47

編集2020/06/20 04:50
cateye

総合スコア6851

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

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

amazing

2020/06/20 05:14

領域について考えてませんでした、ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問