所以对于这个例子,假设我有一个名为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会在开始时分配足够的内存.
我说这不是一种不好的做法,但它也不是很好的做法.
正如杰特的答案指出的那样,可以将其简化为
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及更高版本中,声明halfsize和halfway可以auto用来确定类型).
这些是否更好(例如可读性)是非常主观的.
基本信息是,使用标准算法是一个好主意,其结果是更清晰的代码,并且有明显的等效性.添加其他变量以避免重复表达式有助于提高可读性.
如果你真的必须出于某些原因使用循环(例如,你所做的不仅仅是将向量的一部分复制到其他向量中),那么考虑一下;
reserve()在多次调用之前使用push_back()std::size_t halfsize = original.size()/2在循环之前,而不是original.size()/2在循环内重复计算).特别相关,如果original不是const,因为 - 取决于你的循环做什么 - 编译器确定它不会改变大小的机会较少.| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |