[C++11] std::array のメモ

std::array は生配列と同じように扱える固定長配列です

std::array<std::string, 5> strings;

/// empty: コンテナが空かどうか
assert( ! strings.empty());

/// fill: 全ての要素に値を設定
strings.fill("X");
for (const std::string &str : strings) printf("%s", str.c_str()); // "XXXXX"
puts("");

/// size: 要素数の取得
for (int i = 0; i < strings.size(); i++) strings[[i]] = '0' + i;

/// at で配列外アクセスするとstd::out_of_rangeをスロー
try {
  strings.at(100); // 配列外アクセスで例外スロー
} catch (std::out_of_range &error) {
  printf("Error: %s \n", error.what()); // "Error: array::at"
}

/// operator[] で配列外アクセスの動作は未定義なので危険
/* strings[100] = "配列外アクセスしてもoperator[]は例外スローしない!!!"; */

/// front: 先頭要素の参照を取得, back: 先頭要素の参照を取得
strings.front() = "FRONT";
strings.back() = "BACK";
printf("front: %s \n", strings.front().c_str()); // "FRONT"
printf("back: %s \n", strings.back().c_str()); // "BACK"

/// data: 生配列取得
std::string *data = strings.data();
printf("[3]: %s \n", data[3].c_str()); // [3]: 3

/// initializer list
std::array<std::string, 3> array3{"a", "b", "c"};

/// イテレータ
std::for_each(array3.crbegin(),
              array3.crend(),
              [](const std::string &element) { puts(element.c_str()); });

/// 比較演算子
std::array<std::string, 5> copy = strings;
assert(copy == strings);

copy.front().clear();
assert(copy != strings);

assert(copy < strings);

strings.back().clear();
assert(copy < strings);

strings.front().clear();
assert(copy > strings);

copy = strings;
copy.front() = "a";
strings.front() = "b";
assert(copy < strings);

/// swap
strings.swap(copy);
printf("swap: %s \n", strings.front().c_str()); // "swap: a"

// strings.swap(array); // 要素数が違うためコンパイルエラー

※生配列のラッパにすぎないのでstd::moveで値を他の変数に引き渡そうとしてもコピーが発生する。

Share
関連記事