C++

C++勉強メモ

More than 1 year has passed since last update.

1. std::min_elementとstd::max_element

配列、vectorの最小値、最大値のイテレータを返してくれる
std::min_element(vec.begin(), vec.end());

2. volatile

C++ではコンパイラの最適化を無効にするために使われているそうです。
volatile int a;

ちなみに、調べたところ、C#では、「同時に実行されている複数のスレッドによって、フィールドが変更される可能性があることを示す」の違いがあるそうで、覚えておきます。

3. emplace_backとpush_back

std::vectorに要素を追加する時、emplace_backを使った方がいい
参考Link: http://qiita.com/brackss1/items/e92da6458172397f7225

4. マルチスレッド(c++ 11)

std::thread t([](){
     // ここで別threadの処理

     Director::getInstance()->getScheduler()->performFunctionInCocosThread([]()
     {
            // cocosを使う場合、この中はメインスレッド
     });
    });
//スレッドの管理を手放す
t.detach(); 
//または、t.join()

join():子スレッドが完了するまで、メインスレッドがブロックされる
detach():メインスドットと切り離す。完了後自動リソース開放


スレッド内で一定時間を待つ処理の場合は、sleep使います。
注意点: windowsでは、大文字のSleepがあって、単位が違う
Linux:  unsigned int sleep(unsigned int seconds);  秒
Windows: void Sleep(DWORD dwMilliseconds); ミリ秒


サブスレッドでcocos2d::Refをベースクラスに持つオブジェクトを生成するとクラッシュする恐れがあるので注意する必要がある。

5. std::enable_if

定義:
template< bool B, class T = void >
struct enable_if;

template <typename EnumType,
typename std::enable_if<std::is_enum<EnumType>::value, std::nullptr_t>::type = nullptr>

Tはデフォルトでvoid、std::nullptr_tはnullptrのタイプでポインターなので、省略した書き方は↓

template <typename EnumType, typename std::enable_if<std::is_enum<EnumType>::value>::type* = nullptr>

6. std::find_if

vector、mapなど、条件を満たすオブジェクトを検索する

namespace std {
  template <class InputIterator, class Predicate>
  InputIterator find_if(InputIterator first,
                        InputIterator last,
                        Predicate pred);
}

三番目の引数は関数やラムダ渡して、boolを返す