Sea*_*ean 0 c++ dictionary operator-overloading map data-structures
我试图在c ++中重载[]运算符,以便我可以从我的数据结构中分配/获取值,就像在c#中使用字典一样:
数组["myString"] =等
这在c ++中是否可行?
我试图超载操作员,但它似乎没有工作,
Record& MyDictionary::operator[] (string& _Key)
{
for (int i = 0; i < used; ++i)
{
if (Records[i].Key == _Key)
{
return Records[i];
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
你的代码是在正确的轨道上 - 你有正确的功能签名 - 但你的逻辑有点缺陷.特别是,假设您在没有找到要查找的密钥的情况下完成此循环:
for (int i = 0; i < used; ++i)
{
if (Records[i].Key == _Key)
{
return Records[i];
}
}
Run Code Online (Sandbox Code Playgroud)
如果发生这种情况,您的函数不会返回值,从而导致未定义的行为.由于它返回了一个引用,这可能会导致你尝试使用引用的第二个令人讨厌的崩溃.
要解决此问题,您需要添加一些行为以确保不会脱离函数的末尾.一种选择是将密钥添加到表中,然后返回对该新表条目的引用.这是STL std::map类operator[]函数的行为.另一种情况是抛出一个异常,说密钥不在那里,这确实有一点点违反直觉的缺点.
在完全不相关的说明中,我应该指出,从技术上讲,您不应该将参数命名为此函数_Key.C++标准规定,任何以两个下划线(即__myFunction)开头的标识符名称,或单个下划线后跟大写字母(如您的_Key示例中)都由实现保留,用于他们认为必要的任何目的.他们可以#define将标识符用于无意义的事物,或者将其映射到某些编译器内在函数.如果您从一个平台移动到另一个平台,这可能会导致您的程序停止编译.要解决此问题,请使用K小写(_key)或完全删除下划线(Key).
希望这可以帮助!