我正在尝试使用void *
投射到reinterpret_cast
的地图指针,然后使用static_cast
现在,在将void *
投回map<string, int> *
我尝试了基于范围的循环和迭代器,但我似乎无法找到获取密钥的方法,每次我尝试访问地图值时都会出现分段错误。
这是我所拥有的代码的一个小例子:
auto *map_pointer = new map<string, int>;
for (const auto &entry : array){
if (map_pointer->find(entry) == map_pointer->end()) {
map_pointer->at(entry) = 1;
} else {
map_pointer->at(entry)++;
}
}
void *test = reinterpret_cast<void *>(map_pointer);
auto foo = static_cast<std::map<std::string, int> *>(test);
如果可能的话,我需要找到一种方法来检索地图的键,以便从中获取值
现在我不知道导致分段错误的问题是否在转换为void *
并返回,或者当我试图通过迭代器或循环获取密钥时发生错误。
答案 0 :(得分:2)
void*
和static_cast
。at
以获取地图中找不到的密钥,这会导致std::out_of_range
您更正的代码可能如下所示:
std::map<int, int> m = {{0, 8}, {1, 9}, {2, 32}};
std::vector<int> arr = {0, 3, 2};
for (const auto &entry : arr){
if (m.find(entry) == m.end()) {
m.insert({entry, 1});
} else {
m[entry]++;
}
}
void *mp = &m;
std::map<int, int> *m2 = static_cast<std::map<int, int>*>(mp);
for (const auto& i : *m2) {
std::cout << i.first << ":" << i.second << "\n";
}
打印0:9 1:9 2:33 3:1
。见demo on coliru
答案 1 :(得分:2)
我的经验法则是:
static_cast
进行投射时,请使用static_cast
reinterpret_cast
进行投射时,请使用reinterpret_cast
reinterpret_cast
std::string{"Hello, world"}
在这里应用,我说&#34;两种方式使用reinterpret_cast&#34;。
答案 2 :(得分:1)
为了避免在条目不存在时抛出异常,正确的循环代码为:
for (const auto &entry : array){
++(*map_pointer)[entry];
}
您确定您不仅仅看到导致abort()
的未处理异常吗?