//Inside the header.h
class telefonbok{
std::map<std::string,std::string> telebok;
std::map<std::string,std::string> aliasbok;
}
//Inside the cpp file
void telefonbok::alias(string name, string alias){
if (telebok.find(name) == telebok.end()) {
cout << "Not found" << endl;
} else {
//pointer = Adress stored in pointer.
//*pointer = Value of *pointer
string *pointer;
pointer = &telebok.find(name)->second;
aliasbok.insert(make_pair(alias, *pointer));
cout << *pointer << endl;
}
当我更改第一个地图(telebok)中的值时,地图中的第二个值(aliasbok)保持不变(应该将指针作为值的那个)。
例:
添加彼得123
查找彼得:
彼得:123
别名peter pete
查找皮特:
皮特:123
改变彼得987
查找彼得:
彼得:987
查找皮特:
皮特:123
(皮特永远不会改变这个问题,它应该总是与皮特有相同的价值)
答案 0 :(得分:0)
您必须存储共享指针并将它们适当地设置为相同的字符串。
class telefonbok{
std::map<std::string,std::shared_ptr<std::string>> telebok;
std::map<std::string,std::shared_ptr<std::string>> aliasbok;
}
并提供根据需要更新指针的方法,例如
void addphone(std::string const & name,
std::string const & alias,
std::string const & phone);
{
std::shared_ptr<std::string> phone_ptr(new std::string(phone));
telefonbok.telebok.emplace(name,phone_ptr);
telefonbok.aliasbok.emplace(alias,phone_ptr);
}
这样当你修改手机时,它会在两者上都得到更新。退出功能范围时,手机也不会死亡。
然后你可以这样做更新
void update_phone(std::string const & name,
std::string const & newphone)
{
if( auto iter = telefonbok.telebok.find(name) )
{
*(iter->second.get()) = newphone;
} else if ( auto iter = telefonbok.aliasbok.find(name) )
{
*(iter->second.get()) = newphone;
}
}
答案 1 :(得分:0)
当我更改第一个地图(telebok)中的值时,地图中的第二个值(aliasbok)保持不变(应该将指针作为值)。< / p>
如果aliasbok
应该有指针作为值,那么你的错误就是你错误地定义了地图。这是你的定义:
std::map<std::string,std::string> aliasbok;
注意地图的值类型std::string
是一种值类型,而不是std::string*
这是一种指针类型。
还要注意这一行:
aliasbok.insert(make_pair(alias, *pointer));
取消引用指针并将指向的字符串复制到对中,而不是复制指针。
答案 2 :(得分:0)
首先你的代码是低效的(你调用find两次,这是非常昂贵的操作),所以你应该使用迭代器,而不是指针,它也将有助于解决你的问题:
class telefonbok{
typedef std::map<std::string,std::string> Telebok;
typedef std::map<std::string,Telebok::const_iterator> Aliasbok;
Telebok telebok;
Aliasbok aliasbok;
};
void telefonbok::alias(string name, string alias)
{
Telebok::const_iterator f = telebok.find( name );
if( f == telebok.end() )
cout << "Not found" << endl;
else
aliasbok.insert( make_pair( alias, f );
}
现在你有以下内容:
std::map::find()
从别名代码打印值有点复杂:
for( Aliasbok::const_iterator it = aliasbok.begin(); it != aliasbok.end(); ++it )
cout << "alias " << it->first << " has number " << it->second->second << " original name " << it->second->first << endl;
或找到一个值:
Aliasbok::const_iterator it = aliasbok.find( "abcd" );
if( it != aliasbok.end() )
cout << "phone for " << it->first << " is " << it->second->second << endl;
else
cout << "phone for abcd not found" << endl;
但是在使用迭代器时应该习惯它
注意:如果从电话簿中删除记录,则需要先清理别名,否则它将保留无效的迭代器。正确的解决方案是使用boost::multi_index
,但这可能对您的级别来说太复杂了。