像这样的for循环被认为是不好的做法吗?

Jim*_*tle 7 c++ for-loop

所以对于这个例子,假设我有一个名为original的std :: vector,我想将它分成两半,分成两个不同的向量.假设原始元素数量均匀.

std::vector<int> firstHalf;
std::vector<int> secondHalf;

for (int i = 0, j = original.size()/2; i < original.size() / 2; i++, j++)
{
    firstHalf.push_back(original[i]);
    secondHalf.push_back(original[j]);
}
Run Code Online (Sandbox Code Playgroud)

更明显的方法是使用两个单独的for循环,一个用于填充firstHalf,另一个用于填充secondHalf.

正在编写for循环,就像我认为不好的做法一样吗?从我的测试来看,这个解决方案比两个单独的for循环更有效.

Jet*_*ett 10

实际上,您可以将代码减少到两行:

std::vector<int> firstHalf(original.begin(), original.begin() + original.size() / 2);
std::vector<int> secondHalf(original.begin() + original.size() / 2, original.end());
Run Code Online (Sandbox Code Playgroud)

原因:

push_back可以在元素数量增加时重新分配内存.stl会在开始时分配足够的内存.

  • push_back可以在元素数量增加时重新分配内存.stl会在开始时分配足够的内存. (4认同)

Pet*_*ter 6

我说这不是一种不好的做法,但它也不是很好的做法.

正如杰特的答案指出的那样,可以将其简化为

std::vector<int> firstHalf(original.begin(), original.begin() + original.size() / 2);
std::vector<int> secondHalf(original.begin() + original.size() / 2, original.end());
Run Code Online (Sandbox Code Playgroud)

我可能会尽量避免重新计算original.size()/2.

std::size_t halfsize = original.size()/2;
std::vector<int> firstHalf(original.begin(), original.begin() + halfsize);
std::vector<int> secondHalf(original.begin() + halfsize, original.end());
Run Code Online (Sandbox Code Playgroud)

甚至,

std::vector<int>::const_iterator halfway = original.begin() + original.size()/2;

std::vector<int> firstHalf(original.begin(), halfway);
std::vector<int> secondHalf(halfway, original.end());
Run Code Online (Sandbox Code Playgroud)

(在C++ 11及更高版本中,声明halfsizehalfway可以auto用来确定类型).

这些是否更好(例如可读性)是非常主观的.

基本信息是,使用标准算法是一个好主意,其结果是更清晰的代码,并且有明显的等效性.添加其他变量以避免重复表达式有助于提高可读性.

如果你真的必须出于某些原因使用循环(例如,你所做的不仅仅是将向量的一部分复制到其他向量中),那么考虑一下;

  • reserve()在多次调用之前使用push_back()
  • 在向量而不是数组下标上使用迭代器
  • 预先计算重复使用的值(例如std::size_t halfsize = original.size()/2在循环之前,而不是original.size()/2在循环内重复计算).特别相关,如果original不是const,因为 - 取决于你的循环做什么 - 编译器确定它不会改变大小的机会较少.
  • 在循环中使用标准算法,而不是实现嵌套循环.