今日覚えたこと
勉強しないつもりだったけどTopCoderが近づいてくるとついつい勉強してしまう、プログラマの三大美徳の一つ、自尊心の強さ。
- boost::optional
- HaskellのMaybeみたいなのがC++にもあった!
- これを使えばだいぶ楽になる!
- http://www.kmonos.net/alang/boost/classes/optional.html
- boost::tokenizer
- これは便利、、、なはずだが型がすごいことになっているな
- 与えられた文字列を2文字ずつ取り出して、、、ってのが簡単にできる、はず。
- http://www.kmonos.net/alang/boost/classes/tokenizer.html
- 多分mapを使いこなせるようになっておく必要があるかと思う。
-
-
-
- -
-
-
template<class T, size_t N> size_t len(T (&)[N]){ return N; };
これがありなのだから
template<typename T1, typename T2, size_t N> map<T1, T2> mapzip(T1(&)[N] keys, T2(&)[N] values){ map<T1, T2> m; for(size_t i=0; i<N; i++){ m[keys[i]] = values[i]; } return m; };
これもできることを期待したのだけどそうは問屋がおろさなかった。typenameとか(&)[N]とかをきちんと理解しないといけないようだ。
-
-
-
- -
-
-
template<class T1, class T2> map<T1, T2> mapzip(T1 keys[], T2 values[], size_t N){ map<T1, T2> m; for(size_t i=0; i<N; i++){ m[keys[i]] = values[i]; } return m; }; int main() { int xs[] = {1, 2, 3}, ys[] = {10, 20, 30}; map<int, int> m = mapzip(xs, ys, 3); print_map(m.begin(), m.end()); }
妥協した。
print_map(m)って呼べるやつを作ろうと思ったけどうまく動かない。
-
-
-
- -
-
-
print_mapできた。
template<typename K, typename V> void print_map2(map<K, V> m){ cout << "{"; for(typename map<K, V>::iterator it=m.begin(); it != m.end(); ++it){ if(it != m.begin()) cout << ", "; cout << (*it).first << ":" << (*it).second; } cout << "}" << endl; }
「for(typename」が重要。
-
-
-
- -
-
-
mapzipもできた。
template<class T1, class T2, size_t N> map<T1, T2> mapzip(const T1(&keys)[N], const T2(&values)[N]){ map<T1, T2> m; for(size_t i=0; i<len(keys); i++){ m[keys[i]] = values[i]; } return m; }; int main() { int xs[] = {1, 2, 3}, ys[] = {10, 20, 30}; map<int, int> m = mapzip(xs, ys); print_map2(m); }
変数名が入るのは&の後ということだった。