今日覚えたこと

勉強しないつもりだったけどTopCoderが近づいてくるとついつい勉強してしまう、プログラマの三大美徳の一つ、自尊心の強さ。

  • 多分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);
}

変数名が入るのは&の後ということだった。