vector 解答ページ | Programming Place Plus Modern C++編【標準ライブラリ】 第6章

トップページModern C++編 C++編](../../index.html) – 第6章

Modern C++編は作りかけで、更新が停止しています。代わりに、C++14 をベースにして、その他の方針についても見直しを行った、新C++編を作成しています。
Modern C++編は削除される予定です。

問題①

問題① あなたの使っているコンパイラにおいて、空の std::vector はどれだけのサイズと容量を持つか調べてみてください。


簡単な実験プログラムを書いて確かめてみましょう。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v;

    std::cout << "size: " << v.size() << std::endl;
    std::cout << "capa: " << v.capacity() << std::endl;
}

実行結果

0
0

空の std::vector を生成した直後は、「サイズ」も「容量」も 0 になります。


問題②

問題② 次のプログラムには、std::vector の使い方に関するいくつかの問題が潜んでいます。指摘してください。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v;

    v[3] = 3;

    v.resize(100);

    int* p = &v[10];

    v.insert(v.begin(), 200);

    *p = 10;
}


v は、空の状態で生成されているため「サイズ」は 0 です。したがって、その直後に「v[3] = 3;」のようなアクセスは、範囲外アクセスになってしまいます。添字演算子では、push_backメンバ関数のような、領域の拡張は行われないことに注意してください。

内部要素のメモリアドレスを、ポインタ変数 p に取得した後、insertメンバ関数で要素を挿入しています。要素が挿入されると、後続の要素のメモリアドレスがずれることになるため、イテレータやポインタは無効になります。そのため、この後「*p = 10;」としている部分にも問題があります。


問題③

問題③ この章のサンプルプログラム内で何度か登場した PrintVector関数を、イテレータを使った方法で書き直してください。範囲for文を使わない場合と、使う場合とでそれぞれ書いてみてください。


範囲for文を使わなければ、次のようになります。

#include <iostream>
#include <vector>

using IntVector = std::vector<int>;

void PrintVector(const IntVector& v)
{
    const IntVector::const_iterator itEnd = v.end();
    for (IntVector::const_iterator it = v.begin(); it != itEnd; ++it) {
        std::cout << *it << "\n";
    }
    std::cout << std::endl;
}

int main()
{
    IntVector v(5, 3);
    PrintVector(v);
}

実行結果

3
3
3
3
3

const_iterator の存在を忘れないようにしましょう。指している先の要素を書き換える必要がないのならば、const_iterator を使えます。C++プログラミングの基本に従って、しっかりと const を活用しましょう。

範囲for文を使うなら、次のように書けます。

#include <iostream>
#include <vector>

using IntVector = std::vector<int>;

void PrintVector(const IntVector& v)
{
    for (IntVector::value_type n : v) {
        std::cout << n << "\n";
    }
    std::cout << std::endl;
}

int main()
{
    IntVector v(5, 3);
    PrintVector(v);
}

実行結果

3
3
3
3
3



参考リンク


更新履歴

’2017/11/20 新規作成。



第6章のメインページへ

Modern C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る