【问题标题】:Is there a way to use standalone `std::begin` and for a const_iterator?有没有办法使用独立的 `std::begin` 和 const_iterator?
【发布时间】:2013-11-20 21:03:31
【问题描述】:

我喜欢一致性。我最近问了使用std::begin 与例如的问题。 std::vector<int>::begin,一致的决定似乎是使用前者,因为它更通用。但我想我在泥泞中找到了一根棍子。有时,你想表达你不会在循环时更改容器,因此调用std::vector<int>::cbegin。如果您有时执行iter = v.cbegin() 而其他时间执行iter = begin(v),这将使您的代码非常不对称。有没有办法解决这种缺乏对称性的问题,考虑到这些知识,你还会推荐std::begin 吗?为什么C++没有std::cbegin

【问题讨论】:

  • 注意:C++ 将有 std::cbegin 来到 C++14。
  • "为什么 C++ 没有 ___" 1) 没有人愿意这样做。 2) 它不符合 C++ 的原则(不要为不使用的东西付费,不要对平台做太多假设等) 3) 时间限制。 4) 监督。在你的情况下,可能是 4。
  • 去年 Nicolas Bolas 说这是一个疏忽:stackoverflow.com/questions/12001410/… 不确定这是不是真的,但很有可能。
  • @GManNickG - 我认为知道它是四个中的哪一个很有用。 “不符合原则”意味着它永远不会存在。 “监督”或“时间限制”意味着它很有可能迟早会进入标准。

标签: c++ c++11 iterator const-correctness


【解决方案1】:

当你的容器被声明为“const”时,例如,它作为foo(const std::vector<int> & v)传递给一个函数,那么std::begin实际上会返回一个const_iterator

【讨论】:

  • 对...但这并不是真正的问题。例如。如果我使用带有std::find 的容器,我会使用std::cbeginstd::cend 来保持一致,即使对于非const 容器也是如此。
【解决方案2】:

C++14 有cbegin/cend/等。并且它开始在主要编译器中可用。

【讨论】:

  • 和“等” 草本的意思是:cbegin/cend/rbegin/rend/crbegin/crend
猜你喜欢
  • 2011-03-19
  • 2020-09-22
  • 2012-04-22
  • 2015-12-05
  • 2012-05-28
  • 1970-01-01
  • 2021-06-14
  • 2021-05-30
  • 1970-01-01
相关资源
最近更新 更多