如"标题我"试图编写一个模板类映射,该类映射是在structs of structs of structs上构建的模板类映射,其中我保存着字符串的键和模板类型的值。有一个简短的主程序代表我的班级使用:
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之类的分配操作;但是,当我尝试阅读未初始化的元素时,运算符[]创建了仅包含密钥的新元素,这是错误的。我知道没有这样的事情,例如检查该值是否是不可原始化的。问题在于,写作和阅读操作呼叫运算符[],我不太了解如何在这种情况下引发例外。我已经在网络上看了一眼,发现我可以创建两个索引运算符,一个用于阅读,一个用于写作 -
:TYPE& operator[] (const string index)
TYPE operator[] (const stirng index) const;
和编译器将知道何时使用。但是我想这根本无法解决问题。
不要尝试重新进来std::map
,对其创建一个别名,而是:
template<class Type>
using map = std::map<std::string, Type>;
请记住不要导入using namespace std;
,因为它被认为是不良练习,在这种情况下,您的名称相撞。
是的,std::map::operator[]
总是在地图中创建一个元素。如果元素不存在,则可以使用std::map::at
使其抛出异常std::out_of_range
,或使用map.find(key) == map.end()
检查。
您的主要主体将成为:
int main() {
map<int> iv;
iv["john"] = 23;
int ia = iv["john"]++;
int ib = iv["john"];
std::cout << ia << " " << ib << std::endl; // prints 23 24
try {
int ic = iv.at("jack");
// ^^^^ ^
} catch(const std::out_of_range&) {
// ^^^^^^^^^^^^^^^^^^^^^^^^
std::cout << "Uninitialized map element!" << std::endl;
};
}