🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

2回答

2357閲覧

C++のsort関数の引数について教えていただきたいです

akkey000

総合スコア9

C++

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

0グッド

0クリップ

投稿2021/03/07 10:45

C++初心者です。
以下のようなコードがあったときに
sortの第一引数でソート対象の最初の位置、第二引数でソート対象の最後を指定しているのだと思います。
ただ、aは普通の配列なのに、aだけで最初を指定し、a+Nで最後を指定していることになっている理由がわかりません。
ポインタということでしょうか?

C++

1#include <iostream> 2#include <algorithm> 3using namespace std; 4 5int main() { 6 int N; 7 int a[110]; 8 cin >> N; 9 for (int i = 0; i < N; ++i) cin >> a[i]; 10 11 sort(a, a + N, greater<int>()); // a[0:N] を大きい順にソート 12}

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

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

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

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

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

BeatStar

2021/03/07 11:46

まずは調べましょうよ…… プロでも調べながらやっています。
guest

回答2

0

ベストアンサー

配列名は先頭要素のポインタとなります。
つまりa&a[0],a + N&a[N]と書くのと同じです。

投稿2021/03/07 11:05

SHOMI

総合スコア4079

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

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

akkey000

2021/03/26 13:39

なるほど! では配列aにはポインタ上で考えて順番に並んでいるため、a+NがN番目の配列aの要素が格納されていると考えていいわけですね!
guest

0

ポインタはイテレータとしての要件を満たすからです。 少なくとも配列にとっては。

イテレータにはいくつか種類がありますが、たとえばインプットイテレータに求められる要件としては a!=b のように比較可能でこの式が返す型は bool に変換可能であることなどが定められています。 表を見ればポインタはこれらの要件を全て満たすことがわかると思います。 (実際にはポインタはランダムアクセスイテレータの要件も満たします。)

作法としては質問者の事例で aa+N を渡すよりも std::begin(a)std::end(a) と書いたほうが親切であるとは思いますが、このとき std::begin(a)==astd::end(a)==a+N であることは保証されているのでより簡潔な書き方のほうが見通しが良いと考えるのも普通にあることでしょうね。

cpp

1#include <iostream> 2#include <type_traits> 3 4// 言語仕様上このプログラムは確実に 11 と表示する 5int main(void) { 6 int a[110]; 7 std::size_t N = std::extent<decltype(a)>::value; 8 // std::begin(a) と書くのは a と書くのと同じこと 9 // std::end(a) は a+N と同じこと 10 std::cout << (std::begin(a)==a) << (std::end(a)==a+N) << std::endl; 11}

投稿2021/03/07 14:11

SaitoAtsushi

総合スコア5684

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

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

kazuma-s

2021/03/08 01:56

> 作法としては質問者の事例で a と a+N を渡すよりも std::begin(a) と std::end(a) と書いたほうが親切であるとは思いますが、このとき std::begin(a)==a で std::end(a)==a+N であることは保証されているので 質問者の事例では、std::end(a) は a+110 であり、a+N であることは保証されていません。
akkey000

2021/03/26 13:41

これぞほしかった説明です! 理解できました、ありがとうございます。 > 質問者の事例では、std::end(a) は a+110 であり、a+N であることは保証されていません。 なるほど、こちらの違いも理解できました。お二方ともありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問