Weitere ähnliche Inhalte
Ähnlich wie ぱっと見でわかるC++11 (20)
ぱっと見でわかるC++11
- 1. パッと見でわかる C++11
わんくま同盟茶藝部顧問
episthmh episteme@cppll.jp
プログラミング生放送勉強会 第17回@品川
- 2. episthmhて何者ぞ
• C++界隈ではちったー名の知れたソフト屋
• Microsot MVP for Visual C++ 2004~
• モノ書き? DDJJ, C-Magazine… CodeZine
• 書籍いくつか
プログラミング生放送勉強会 第17回@品川
- 3. Visual Studio (VC++) と C++11
• Visual Studio 2010 は
– C++11 の”いくつか”をサポート
• Visual Studio 2012 では
– 言語レベルでの強化 と
– ライブラリ追加 によって
– より C++11 に迫っています
– “フルコンプ”じゃないけどね
プログラミング生放送勉強会 第17回@品川
- 4. array<T,N>
int data[N] = { 1, 2, 3 };
for_each( data, data+N, … );
array<int,N> data = { 1, 2, 3 };
for_each( data.begin(), data.end(), … );
begin(), end(), size() などなど、
container系メンバ関数が使えます。
プログラミング生放送勉強会 第17回@品川
- 5. begin(), end()
vector<int> v;
int a[N] ;
for_each( v.begin(), v.end(), … );
for_each( a, a+N, …)
vector<int> v;
int a[N];
for_each( begin(v), end(v), … );
for_each( begin(a), end(a), …);
containerと思しきもののアタマとケツは、
begin()/end() で統一できます。
プログラミング生放送勉強会 第17回@品川
- 6. auto
vector<int> v;
for ( vector<int>::iterator iter = v.begin();
iter != v.end(); ++iter ) {
cout << *iter << endl;
}
vector<int> v;
for ( auto iter = v.begin(); iter != v.end(); ++iter ) {
cout << *iter << endl;
}
「型推論」
ずっと欲しかった機能。
プログラミング生放送勉強会 第17回@品川
- 7. range-based for
vector<int> v;
for ( vector<int>::iterator iter = v.begin();
iter != v.end(); ++iter ) {
cout << *iter << endl;
}
vector<int> v; vector<int> v;
for ( int item : v ) { for ( auto item : v ) {
cout << item << endl; cout << item << endl;
} }
begin(), end() が適用できるcontainerと思しきもの
であれば、range-based for が使えます。
プログラミング生放送勉強会 第17回@品川
- 9. lambda式
void print_int(int item) { cout << item << endl; }
…
vector<int> v;
for_each( v.begin(), v.end(), print_int);
vector<int> v;
for_each( v.begin(), v.end(),
[](int item) { cout << item << endl; }
);
関数オブジェクトをその場で定義しちゃうです。
プログラミング生放送勉強会 第17回@品川
- 10. stateless-lambdaは関数ポインタに暗黙変換できる
int main() {
const int N = 10;
int data[N] = { 9, 7, 5, 3, 1, 0, 2, 4, 6, 8 };
// qsortの比較関数にlambdaをねじ込む
qsort(data, N, sizeof(int),
[](const void* x, const void* y)->int
{ return *static_cast<const int*>(x)
- *static_cast<const int*>(y);}
);
for ( auto item : data ) {cout << item << ' '; }
cout << endl;
}
stateless-lambda: なにもキャプチャしないlambda
プログラミング生放送勉強会 第17回@品川
- 11. stateless-lambdaは関数ポインタに暗黙変換できる
wcout.imbue(locale("japanese"));
// EnumWindows に与える CALLBACK に stateless lambda を。
EnumWindows(
[](HWND hWnd, LPARAM lParam)->BOOL {
TCHAR buf[256];
GetWindowText(hWnd, buf, 256);
if ( buf[0] != L'0' ) {
*reinterpret_cast<wostream*>(lParam)
<< buf << endl;
}
return TRUE;
},
reinterpret_cast<LPARAM>(&wcout));
__cdecl, __stdcall のどちらにも使えます。
プログラミング生放送勉強会 第17回@品川
- 12. Win-API によるスレッド
// スレッド本体
int plus(int x, int y) { return x + y; }
// Win32 thread のためのwrapper
typedef tuple<int,int,int> thread_io;
DWORD WINAPI plus_entry(LPVOID argv) {
thread_io* io = static_cast<thread_io*>(argv);
get<2>(*io) = plus(get<0>(*io),get<1>(*io));
return 0;
}
int main() {
HANDLE handle;
thread_io pio(1,2,0);
handle = CreateThread(NULL, 0, &plus_entry, &pio, 0, NULL);
WaitForSingleObject(handle, INFINITE);
CloseHandle(handle);
cout << get<2>(pio) << endl;
} 従来のスレッドは wrapper を必要とし
ます
プログラミング生放送勉強会 第17回@品川
- 13. <thread>
#include <iostream>
#include <thread>
using namespace std;
int plus_int(int x, int y) { return x + y; }
int main() {
int result;
thread thr([&](int x, int y) { result = plus_int(x,y);}, 1, 2);
thr.join();
cout << result << endl;
} コンストラクタに与えた関数オブジェ
クトを
スレッドで実行します。
プログラミング生放送勉強会 第17回@品川
- 15. <mutex>
#include <mutex>
…
mutex mtx;
int balance = 0;
void plus_int(int x)
{ lock_guard<mutex> guard(mtx); balance += x; }
int main() {
thread thr_inc([&](int n) { while ( n-- ) plus_int( 1);}, 1000000);
thread thr_dec([&](int n) { while ( n-- ) plus_int(-1);}, 1000000);
thr_inc.join();
thr_dec.join();
cout << balance << endl;
} Win-API の CriticalSection 相当。
プログラミング生放送勉強会 第17回@品川
- 16. <atomic>
#include <thread>
#include <atomic>
using namespace std;
int main() {
atomic<int> balance = 0;
thread thr_inc([&](int n) { while ( n-- ) ++balance; }
, 1000000);
thread thr_dec([&](int n) { while ( n-- ) --balance; }
, 1000000);
thr_inc.join();
thr_dec.join();
cout << balance << endl;
}
Win-API の InterlockedXXX 相
当。
プログラミング生放送勉強会 第17回@品川