vectorについてです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
vector

vectorについてです

#1

投稿記事 by vector » 8年前

コード:

 int ar[] = {1, 2, 3, 4, 5, 6, 7};
    vector<int> v{9, 8};
    v.assign(&ar[0], &ar[3]);        // v の内容は{1,2,3}になる
vectorを学ぼうと、とあるサイトを眺めていたのですがvectorのassignメンバ関数のところで早速つまずきました。
assignは(first* , last*)を取ると書いてあり、このプログラムでは&ar[0], &ar[3]を渡しています。なので、ar[0} = 1, ar[3] = 4なので、vの内容は{1,2,3,4}になると思ったのです。
間違いかなと思い、自分でコンパイルしてみたところ、確かにv[0]、v[1]、v[2]にはそれぞれアクセスでき、それぞれに1,2,3が入っていたのですが、v[3]はアクセスできませんでした。
どうしてvにはar[0]からar[2]までの値しか入れられていないのでしょうか?

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: vectorについてです

#2

投稿記事 by ISLe » 8年前

assignの2つめの引数は、最後の要素位置ではなく、最後の要素を超える最初の位置、です。

C++言語の規格において保証されるのは
配列要素のポインタの大小比較は、同一の配列の要素同士に限り
最初の要素から、最後の要素をひとつ越えた位置までの範囲
と決められています。

コード:

int ar[] = {1, 2, 3, 4, 5, 6, 7};
であれば、&ar[0]~&ar[7]までに限ってポインタの大小比較が期待通り動作するということです。
&ar[7]は使えるがar[7]は使えない(領域外アクセスになる)という点に注意。

以上の仕様により、vectorのイテレータが終点を判定するために、最終要素の次が必要なのです。

vector

Re: vectorについてです

#3

投稿記事 by vector » 8年前

>>ISleさん


私の質問に時間を割いて頂いたのにも関わらず、返信が遅れてしまい本当に申し訳ございません。

ご解答ありがとうございます。
なるほど、assignは最後の要素の次を教えるのですね。ずっとモヤモヤしていて、他のvectorのメンバ関数についてもこれと全く同じ疑問があったので、非常に困っておりました。
どうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る