我应该使用std :: begin和数组吗?

时间:2013-11-05 18:32:08

标签: c++ arrays iterator

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

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,你可能会冒险不了解C ++中数组和指针的基本操作。实际上,我可能永远不需要更换容器的能力。我的意思是,来吧。如果您实际更改了容器,则会遇到编译器错误并在3秒内修复它。

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

3 个答案:

答案 0 :(得分:4)

作为一种惯例,在这种情况下使用begin确实没有你认为它存在的任何缺点。相反,为了炫耀你理解C ++如何工作的一个方面,不使用它似乎是不一致和毫无意义的复杂性。它将导致下一个人看这个代码看两次以理解为什么你没有对称地使用beginend,浪费时间。

更具体地说,在这里使用begin可以让您在不破坏任何代码的情况下更改a的类型。

答案 1 :(得分:1)

  

您对在编码方面使用begin(a)有什么想法?   做法?

使用它。

假设您正在讨论使用begin而不是索引数组(例如arry[0]),您更改容器并修复生成的编译器错误的假设很简单不切实际

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

答案 2 :(得分:1)

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

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