【问题标题】:Efficient way to refer to the type-name of the iterator without typing the entire container definition?在不输入整个容器定义的情况下引用迭代器的类型名称的有效方法?
【发布时间】:2013-01-22 21:58:12
【问题描述】:

有没有比键入更有效的方法来引用容器迭代器的类型名

std::unordered_map<keyclass, valueclass>::iterator 

每次我都需要迭代器?

当然有

typedef boost::unordered_map<keyclass, valueclass>::iterator classitr

但是为每个容器引入 typedef 并没有让我觉得它是非常易读的代码。 作为 C++ 的新手,并假设一个人通常引用他们想要使用的容器 - 是否有类似

的内容
Container<KeyClass, ValueClass> x;

x::iterator_type i

或我遗漏的任何其他明显快捷方式?

【问题讨论】:

  • 如果您使用algorithms library,您就不必过多地引用迭代器类型。
  • @PeterWood 我仍然在用 C 语言思考,所以我注意到了所有这些函数,但从未经常使用它们。我会尝试一下。谢谢!

标签: c++ boost containers boost-iterators


【解决方案1】:

这也是C++11引入auto关键字新含义的原因之一:

auto it = vec.begin();

编译器会从初始化器中计算出it的类型,类似于模板类型推导。

在 C++11 之前,通常的方法是按照您的建议使用 typedefs。 typedef 容器通常最有用,然后提供与之相关的所有内容:

typedef std::unordered_map<key, value> map;
map m;
map::iterator = m.begin();

您可以为您的typedef 取一个更有意义的名称,以准确描述map 的类型。例如,如果您有一个从姓名到电话号码的映射,您可以将其命名为 phone_map,而迭代器将是 phone_map::iterator

auto也是完美转发的好工具

【讨论】:

  • 谢谢。我还没有完全了解 C++11 标准将带来什么——所以我没有想到这一点。有没有非 C++11 的方法? (对不起我之前的简短回答,我不知道按回车会提交我的评论)
  • @Stefan 不是“将带来”,而是“已经带来”。使用typedefs 是 C++11 之前的典型解决方案。
  • @sftrabbit:当他进行切换时,“将带来”他的代码。不是每个人都在使用 C++11。我暂时不会把它带入我们的生产代码中。
  • Typedef'ing 容器看起来相当不错;我没有想到这一点。并感谢您确认没有类似于我所希望的“干净”的 Pre-C++11 解决方案。至于 C++11,由于我对新标准的了解还不够深入,而且 Apache wiki 上的支持矩阵让我头晕目眩,我想我还是坚持先学习 C++,然后再迈向 C++11 ,当我亲眼看到它的优势时。你的回答给了我第一个例子。 :) 感谢您的详细解答。
【解决方案2】:

在 C++11 中,您可以使用 decltype 从变量中获取类型。

写:

std::unordered_map<keyclass, valueclass> m;
decltype(m)::iterator it = m.begin();

当然,如果你使用的是 C++1,那么你也可以只写:

std::unordered_map<keyclass, valueclass> m;
auto it = m.begin();

【讨论】:

  • 谢谢 - decltype 似乎完全符合我在我的问题中所希望的。期待迈向 C++11 的另一个理由。 :) SO 中的知识令人惊叹。
猜你喜欢
  • 1970-01-01
  • 2020-03-18
  • 2018-10-18
  • 2014-08-07
  • 2012-11-18
  • 2019-06-17
  • 2013-02-25
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多