4

std::vector配列は簡単かつ効率的に変換できます。

template <typename T, int N>
vector<T> array_to_vector(T(& a)[N]) {

  return vector<T>(a, a + sizeof(a) / sizeof(T));

}

std::mapメンバーを反復処理せずに2次元配列をに変換する同様の方法はありますか?これは珍しい関数シグネチャのように見えますが、私の特定の状況では、これらのマップのキーと値は同じタイプになります。

template <typename T, int N>
map<T, T> array_to_map(T(& a)[N][2]) {

  // ...?

}

これが私がこの質問のためにまとめたテストコードです。コンパイルしてそのまま実行します。目標は、コメントなしのブロックコメントを使用してコンパイルすることmainです。

#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

template <typename T, int N>
vector<T> array_to_vector(T(& a)[N]) {

  return vector<T>(a, a + sizeof(a) / sizeof(T));

}

template <typename T, int N>
map<T, T> array_to_map(T(& a)[N][2]) {

  // This doesn't work; members won't convert to pair 

  return map<T, T>(a, a + sizeof(a) / sizeof(T));

}

int main() {

  int a[] = { 12, 23, 34 };

  vector<int> v = array_to_vector(a);

  cout << v[1] << endl;

  /*
  string b[][2] = {
    {"one", "check 1"},
    {"two", "check 2"}
   };

  map<string, string> m = array_to_map(b);

  cout << m["two"] << endl;
  */
}

繰り返しますが、配列の各メンバーを反復処理するコードで答えを探しているわけではありません...自分で書くことができます。それがもっと良い方法でできないなら、私はそれを答えとして受け入れます。

4

1 に答える 1

6

以下は私にとってはうまくいきます:

template <typename T, int N>
map<T, T> array_to_map(T(& a)[N][2]) 
{
    map<T, T> result;
    std::transform(
        a, a+N, std::inserter(result, result.begin()),
        [] (T const(&p)[2]) { return std::make_pair(p[0], p[1]); }
        );

    return result;
}

C ++ 03をお持ちの場合は、

template <typename T>
static std::pair<T, T> as_pair(T const(&p)[2]) {
    return std::make_pair(p[0], p[1]);
}

template <typename T, int N>
map<T, T> array_to_map(T(& a)[N][2]) {
    map<T, T> result;
    std::transform(a, a+N, std::inserter(result, result.begin()), as_pair<T>);
    return result;
}

完全なデモhttp://liveworkspace.org/code/c3419ee57fc7aea84fea7932f6a95481

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iterator>

using namespace std;

template <typename T, int N>
vector<T> array_to_vector(T const(& a)[N]) {
  return vector<T>(a, a + sizeof(a) / sizeof(T));
}

template <typename T>
static std::pair<T, T> as_pair(T const(&p)[2])
{
    return std::make_pair(p[0], p[1]);
}

template <typename T, int N>
map<T, T> array_to_map(T const(& a)[N][2]) 
{
    map<T, T> result;

    // C++03: std::transform(a, a+N, std::inserter(result, result.begin()), as_pair<T>);
    std::transform(
        a, a+N, std::inserter(result, result.begin()),
        [] (T const(&p)[2]) { return std::make_pair(p[0], p[1]); }
        );

    return result;
}

int main() {

  int a[] = { 12, 23, 34 };
  vector<int> v = array_to_vector(a);
  cout << v[1] << endl;

  const string b[][2] = {
    {"one", "check 1"},
    {"two", "check 2"}
   };

  map<string, string> m = array_to_map(b);

  cout << m["two"] << endl;
}
于 2012-10-07T20:45:32.107 に答える