将2D数组转换为std :: map?

时间:2012-10-07 20:23:35

标签: c++ arrays map vector

可以轻松高效地将数组转换为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而不迭代成员?这看起来像一个不寻常的函数签名,但在我的特殊情况下,这些映射中的键和值将是相同的类型。

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;
  */
}

同样,我不是在寻找代码的答案,这些代码遍历数组的每个成员......我可以自己编写。如果不能以更好的方式完成,我会接受这个答案。

1 个答案:

答案 0 :(得分: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;
}