std::arrayとstd::iota

std::array

std::array<T,n>は,T型のn個の固定長配列を表す型らしい.std::vector<T>と違い,固定長なので,push_back()などの操作はできない…と思う.これは,#include <array>すると使えるようになる.

std::iota

std::iota(a.begin(), a.end(), i)は,vectorとかlistとかarrayなどのコレクションのbegin()からend()までを,iから始まる値で埋めていく関数…だと思う.順に,i, i+1, i+2, …と値が入る.これは#include <numeric>をいれると使えるようになる.

使用例

コードは以下のとおり.GCCでコンパイルする場合は,オプションで,-std=c++0xが必要.

#include <array>
#include <numeric>
#include <iostream>
#include <algorithm>
void disp(int x){
	std::cout << x << std::endl;
}
int main(){
	std::array<int,5> a={1,1,1,1,1};
	std::for_each(a.begin(),a.end(),disp);
	std::iota(a.begin(),a.end(),10);
	std::for_each(a.begin(),a.end(),disp);
	return 0;
}

std::array<int, 5>型の変数aの各要素をstd::for_each(これは#include <algorithm>で使える)を使ってvoid disp(int x)という関数に渡して順に表示している.そのあと,std::iotaを使って値を10,11,…に変更.最後にその結果を表示している.この出力結果は

1
1
1
1
1
10
11
12
13
14

のようになる.

2010年12月05日のツイート

2010年12月06日のツイート

2010年12月04日のツイート

Visual Studio 2008 でコンパイルできたすごいコード

関数戻り値部分でのクラス定義

C++では,関数の戻り値の型を関数宣言/定義時に指定する.

Hoge func(){
    Hoge x;
    return x;
}

こんな感じに指定すると,先頭部分で関数の戻り値がHoge型だということがわかる.
クラスの定義は,

class Hoge{
    public:
        Hoge(){}
        void hello(){ std::cout << "Hello" << std::endl; }
};

という感じで行う.今回,これをくっつけてみたら,コンパイルが通った.

class Hoge{
    public:
        Hoge(){}
        void hello(){ std::cout << "Hello" << std::endl; }
} func(){
    Hoge x;
    return x;
}
int main(){
    Hoge a = func();
    a.hello(); // Helloが出力される
}

Visual Studio 2008では,コンパイルが通ったけど,gcc 4.4.5ではコンパイル通らなかった.gccでは,「class宣言の後ろにセミコロン抜けてるよ」というエラーが出力された.
文法的にはどっちが正しいのだろう?

2010年12月02日のツイート