0

作为一个简单的例子,看一下这段代码(或者想象一下特定于数组的代码而不是模板和其他通用编码技术):

int a[] = {1,2,3,7,8,9,55};
vector<int> v(a, end(a));
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

我想知道这里是否有编码原因std::begin或可能在不同的设置中使用(样式/一致性/与未来代码更改的兼容性/等)。会有实际需要的地方吗?

您对在begin(a)编码实践方面使用那里有什么想法?对我来说,这是一个敏感的话题,因为如果你盲目地调用std::begin. 实际上,我可能永远不需要更改容器的能力。我的意思是,来吧。如果你真的改变了容器,你会得到一个编译器错误并在 3 秒内修复它。

您听说过“过早优化”。我会std::begin在这里使用“过早的普遍性”。

4

3 回答 3

4

作为一种实践,begin在这种情况下使用确实不会有任何你认为它有的缺点。相反,为了炫耀你了解 C++ 如何工作的一个方面,不使用它似乎是不一致和毫无意义的复杂化。这将导致下一个看此代码的人多看两眼,以了解您为什么不使用begin并且end对称地浪费时间。

更具体地说,使用here 允许您在不破坏任何代码begin的情况下更改类型。a

于 2013-11-05T18:38:45.580 回答
1

在编码实践方面,您对使用 begin(a) 有什么看法?

用它。

假设您正在谈论使用begin而不是索引数组(例如arry[0]),那么您认为更改容器并修复由此产生的编译器错误将很简单的假设是不切实际的。

想象一下一个代码库,它由分布在各处的数十个不同模块中的 1,000,000 行代码组成。您可能会尝试从任何地方以及您早已忘记的地方访问此集合。修复所有编译器错误可能需要数小时或数天。这个例子不是人为的。我工作的代码库有几百万行代码——其中一些我在几年前就忘记了。

于 2013-11-05T18:40:51.317 回答
1

您应该只在编写模板时使用它。在常规代码中你是对的,它不是必需的。

如果您编写与容器一起使用的模板,那么您不知道它是常规数组还是向量或其他东西。因此 usingx.begin()不适用于数组,任何适用于数组的东西都不适用于 STL 容器。因此,您使用 begin 来弥合差距并忽略差异,以便模板仅适用于数组和 STL 容器。

于 2013-11-05T18:45:23.847 回答