在 while 循环中向 std::map 添加一个条目会覆盖上次输入的对

Adding an entry to std::map in a while loop overwrites last entered pair

本文关键字:覆盖 一个 输入 循环 while std map 添加      更新时间:2023-10-16

问题:我在 while 循环中向地图添加条目,每次它在同一点开始时,即先前输入的条目被忽略/覆盖。

代码:

#include <iostream>
#include <map>
int main(){
    char* key=new char;
    char *name, *address;
    name=new char[80];
    address=new char[80];
    std::map<char*, char*> addressBook;
    while(true){
        std::cout<<"Please select action: n";
        std::cout<<"e - exitn";
        std::cout<<"a - add new addressn";
        std::cout<<"p - print address bookn";
        std::cin>>key;
        switch(key[0]){
            case 'a':
                std::cin>>name>>address;
                std::cin.clear();
                std::cin.ignore(500,'n');
                addressBook[name]=address;
                std::cout<<addressBook.size()<<"n";
                break;
            case 'p':
                for(std::map<char*,char*>::iterator it = addressBook.begin();it!=addressBook.end(); ++it)
                    std::cout<<it->first<<" "<<it->second<<"n";
                break;
            default:
                return 0;
        }
    }
}

设置:代码::使用 MinGW/gcc 4.7.1 的区块

您只将char *存储在映射(指针)中,而不是指针的值。同一个指针一遍又一遍地被存储,用户输入只是在改变指向的内容。

相反,你真的想有一个std::map<std::string, std::string>,并读std::string s,而不是char * s。经验法则是,在现代C++中,您几乎永远不必使用 new .

使用在此处找到的插入方法。如前所述,您执行此操作的方式只是覆盖最后一个键。