C++ 转换地图<;字符串,int>;取消*并返回并获取密钥

C++ 转换地图<;字符串,int>;取消*并返回并获取密钥,c++,c++11,pointers,void-pointers,C++,C++11,Pointers,Void Pointers,我试图使用重新解释\u cast将映射指针投射到void*,然后使用静态\u cast将其投射回 现在,在将void*强制转换回map*后,我在尝试获取存储在map中的值时遇到了一个问题 我尝试使用基于范围的循环和迭代器,但似乎找不到获取关键点的方法,每次尝试访问贴图值时,我都会遇到分割错误 这是我的代码的一个小例子: auto *map_pointer = new map<string, int>; for (const auto &entry : array){

我试图使用
重新解释\u cast
将映射指针投射到
void*
,然后使用
静态\u cast
将其投射回

现在,在将
void*
强制转换回
map*
后,我在尝试获取存储在map中的值时遇到了一个问题

我尝试使用基于范围的循环和迭代器,但似乎找不到获取关键点的方法,每次尝试访问贴图值时,我都会遇到分割错误

这是我的代码的一个小例子:

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);
auto*map\u指针=新地图;
用于(常数自动输入:数组){
如果(映射指针->查找(条目)=映射指针->结束()){
地图指针->在(入口)=1;
}否则{
映射指针->在(入口)+;
}
}
void*test=reinterpret\u cast(映射指针);
自动foo=静态施法(测试);
如果可能的话,我需要找到一种方法来检索映射的键,以便从中获取值。
现在,我不知道导致分段错误的问题是在转换到
void*
并返回时出现的,还是在我尝试使用迭代器或循环返回键时出现的错误。

  • 关于指针的转换-正如StoryTeller所指出的-您可以在需要时将映射指针分配给
    void*
    static\u cast
  • 关于segfault,调用
    at
    查找地图中未找到的密钥,这将导致
    std::out_of_range
更正后的代码可能如下所示:

std::map m={{0,8},{1,9},{2,32};
向量arr={0,3,2};
用于(常数自动输入:arr){
如果(m.find(entry)=m.end()){
m、 插入({entry,1});
}否则{
m[输入]++;
}
}    
void*mp=&m;
std::map*m2=静态压力(mp);
用于(常数自动和仪表:*m2){
标准::cout
  • 关于指针的转换-正如StoryTeller所指出的-您可以在需要时将映射指针分配给
    void*
    static\u cast
  • 关于segfault,调用
    at
    查找地图中未找到的密钥,这将导致
    std::out_of_range
更正后的代码可能如下所示:

std::map m={{0,8},{1,9},{2,32};
向量arr={0,3,2};
用于(常数自动输入:arr){
如果(m.find(entry)=m.end()){
m、 插入({entry,1});
}否则{
m[输入]++;
}
}    
void*mp=&m;
std::map*m2=静态压力(mp);
用于(常数自动和仪表:*m2){
std::cout我的经验法则是:

  • 当您使用
    static\u cast
    进行强制转换时,请使用
    static\u cast
  • 使用
    reinterpret\u cast
    进行强制转换时,请使用
    reinterpret\u cast
  • 如果您计划强制转换一个值,然后使用强制转换的值,请不要使用
    重新解释强制转换
  • 如果转换是众所周知的/普通的转换,例如
    std::string{“Hello,world”}
应用于此,我会说“双向使用重新解释”

  • 当您使用
    static\u cast
    进行强制转换时,请使用
    static\u cast
  • 使用
    reinterpret\u cast
    进行强制转换时,请使用
    reinterpret\u cast
  • 如果您计划强制转换一个值,然后使用强制转换的值,请不要使用
    重新解释强制转换
  • 如果转换是众所周知的/普通的转换,例如
    std::string{“Hello,world”}

应用于这里,我会说“双向使用reinterpret_cast”。

为了避免在条目不存在时引发异常,正确的循环代码如下:

for (const auto &entry : array){
    ++(*map_pointer)[entry];
}

您确定看到的不仅仅是一个未处理的异常,它会导致
中止()

为避免在条目不存在时引发异常,正确的循环代码如下:

for (const auto &entry : array){
    ++(*map_pointer)[entry];
}

您确定看到的不仅仅是一个未处理的异常导致的
abort()异常吗

void*test=map\u pointer;
-就是这样。没有必要为这样的事情拔出铸型的氢弹basic@StoryTeller类似于?@pergy-非常像这样。你也可以避免多余的动态分配。我没有提到这一点,只是想继续讨论这个话题。顺便说一句,你对
find()的使用
是多余的,当
find()
返回
end()
时,使用
at()
是错误的(抛出异常),您需要使用
insert()
来代替。您可以通过使用
操作符[]
为您执行查找+插入逻辑来简化循环:
for(const auto&entry:array){*(映射指针)[entry]+;}
您向我们展示的代码很好-因此这与您未展示的代码有关。我们需要一个请柬。
void*test=map\u pointer;
-就是这样。没有必要为这样的事情拔掉铸件的氢弹basic@StoryTeller类似于?@pergy-非常像这样。你避免了多余的dyna,这对你有好处麦克风分配也一样。为了继续讨论这个话题,没有提到它。另一方面,您使用
find()
是多余的,当
find()
返回
end()
时,您使用
at()
是错误的(抛出异常),您需要使用
insert()
来代替。您可以使用
操作符[]
为您执行查找+插入逻辑:
for(const auto&entry:array){*(map_pointer)[entry]++;}
您向我们显示的代码很好-因此这与您未显示的代码有关。我们需要一个please。如果我不尝试查找条目,程序将返回0(main结尾),分段错误(退出代码11)仅当我尝试检索地图时才显示values@JohnSmith
at