gpt4 book ai didi

c++ - 将二维数组转换为 std::map?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:05 25 4
gpt4 key购买 nike

数组可以轻松高效地转换为 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 中的 block 注释未注释。

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

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

最佳答案

以下对我来说效果很好:

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

关于c++ - 将二维数组转换为 std::map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com