【问题标题】:C++ [] mapping, possibly through templatesC++ [] 映射,可能通过模板
【发布时间】:2010-09-10 07:49:41
【问题描述】:

我在 C++ 中有一个小问题,我不知道如何解决。 问题的第一部分是通过 [] 访问结构中的元素,或者更好的是,将 [] 映射到子元素。

我的结构是这样的:

struct e {
    std::string content;
    std::string name;
    std::map<std::string, std::vector<e> > elements;
};

如果我想访问 e 的子元素,我可以这样做:e.elements["e1"][0].elements["e1sub"][0].content,是否可以映射它以便我可以这样称呼它:e["e1"][0]["e1sub"][0],这只是意味着他有用 e.elements[]“替换”每个 e[]。

也许这可以通过模板来完成,但我还不知道如何使用它们,因为我刚刚开始学习 C++。

提前感谢您的帮助,罗宾。

【问题讨论】:

  • struct e 中的vector&lt;e&gt; 在技术上是非法的吗(不完整类型的向量,尽管取决于实现细节,您可以逃脱)?
  • 除了下面给出的所有建议之外,建议将elements 设为私有/受保护成员

标签: c++ templates struct operator-overloading dynamic-data


【解决方案1】:

你需要重载operator[]。通常,您希望实现该运算符的两个版本,但由于std::map 仅重载非const 版本,这对您来说可能就足够了。

应该执行以下操作:

struct e {
    std::string content;
    std::string name;
    std::map<std::string, std::vector<e> > elements;

    std::vector<e>& operator[](const std::string& key) {return elements[key];}
};

【讨论】:

  • 这是一个很好的答案,但是如果您要重载运算符,也许是时候将数据放入真正的类中了?
【解决方案2】:

你可以“重载” [] 操作符,试试:

struct e {
    std::string content;
    std::string name;
    std::map<std::string, std::vector<e> > elements;
    std::vector<e>& operator [](const std::string& s);
};

...

std::vector<e>& e::operator [](const std::string& s) {
    return elements[s];
}

【讨论】:

  • 在 C++ 中,绝对不需要 typedef struct e {...} e; - 只有在 C 中才需要。
【解决方案3】:

您不需要模板。你只需要一个operator[]

std::vector<e>& e::operator[](std::string const& s) { return this->elements[s]; }
// elements.operator[s] inserts s if it doesn't exist yet. That's non-const so the following won't work
// std::vector<e> const& e::operator[](std::string const& s) const { return this->elements[s]; }

【讨论】:

  • const 版本必须比std::map 更精细。此外,实施它您将面临同样的问题,导致std::map 没有const 过载operator[]()。你需要升级你的溢出夹头。 :)
  • 1) 你没有把你的评论归于你的答案,我只是偶然来到这里。 2)我不知道“ofc”代表什么。
  • @sbi:我没有归因于评论,因为它不是回应。我为其他读者添加了评论,这样他们就不会被误导认为您的评论适用于最新代码。 “ofc”代表“当然”,我认为这是一个常见的缩写。
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2021-08-30
  • 2012-06-28
  • 2015-02-02
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多