模板类映射构建在stl :: structs的向量上 - 寻找无效的键(stl :: string)并抛出异常



如"标题我"试图编写一个模板类映射,该类映射是在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;
    };
}

相关内容

最新更新