【发布时间】:2014-02-25 12:02:13
【问题描述】:
如标题所示,我正在尝试编写一个基于结构向量的模板类映射,其中我持有作为字符串的键和模板类型的值。有一个简短的主程序代表我的类的用法:
int main()
{
map<int> iv;
iv["john"] = 23;
int ia = iv["john"]++;
int ib = iv["john"];
cout << ia << " " << ib << endl; // prints 23 24
try{
int ic = iv["jack"]; // should throw an exception
}catch(map<int>::Uninitialized&)
{
cout << "Uninitialized map element!" << endl;
};
}
还有我写过的课程:
class map
{
private:
struct FIELD
{
string key;
TYPE value;
};
vector<FIELD> data;
public:
TYPE& operator[] (const string index)
{
typename vector<FIELD>::iterator idx;
for(idx = data.begin(); idx != data.end(); ++idx)
{
if(idx->key == index) return idx->value;
}
if(idx == data.end())
{
FIELD toAdd;
toAdd.key = index;
data.push_back(toAdd);
}
for(idx = data.begin(); idx != data.end(); ++idx)
{
if(idx->key == index) return idx->value;
}
return idx->value;
}
};
它只适用于像 `iv["john"] = 23; 这样的赋值操作 但是当我尝试读取未初始化的元素时, operator[] 创建仅包含键的新元素,这是错误的。我知道没有像检查值是否未初始化这样的事情。问题是写入和读取操作都调用 operator[] ,我不太明白在这种情况下如何抛出异常。 我浏览了整个网络,发现我可以创建两个索引运算符,一个用于读取,一个用于写入 - 像这样:
TYPE& operator[] (const string index)
TYPE operator[] (const stirng index) const;
编译器会知道什么时候使用哪个。但我想这根本解决不了问题。
【问题讨论】:
-
在
std::map中,他们已经做到了operator[]总是使用默认构造的T自动创建新元素,而at是一个会抛出异常的元素,如果它不在那里。 -
是的,我知道,但是如何在索引为 stl::string 的 stl::vector 上实现 at() 功能?
-
只需将
throw放在if(idx == data.end())中,而不是添加一个新的。 -
您在这里没有太多选择。要么 (1) 没有返回引用的
operator[],要么 (2) 模仿std::map行为,要么 (3) 每当找不到键时抛出异常。at()从不向向量添加新项目,因此您可以使用选项 3 轻松复制此行为。 -
标准命名空间是
std,而不是stl(这是一个很好的理由,STL 与它完全无关)
标签: c++ exception vector map operator-keyword