我认为这不是一个坏的做法,但也不是很好的做法。正如Jett的回答所指出的那样,可以将其简化为:
std::vector<int> firstHalf(original.begin(), original.begin() + original.size() / 2);
std::vector<int> secondHalf(original.begin() + original.size() / 2, original.end());
我觉得最好避免重新计算 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());
或者,甚至,
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());
(在 C++11 及以后版本中,
halfsize
和
halfway
的声明可以使用
auto
来确定类型)。
无论这样做是否更好(例如可读性),都高度主观。
核心信息是,在结果更干净、效果明显等情况下,使用标准算法是个好主意。添加额外的变量来避免重复表达式可以提高可读性。
如果出于某种原因确实需要使用循环(例如你要做的不仅仅是将向量的部分复制到其他向量中),那么请考虑以下几点:
- 在多次调用
push_back()
之前使用 reserve()
- 使用向量迭代器而不是数组下标
- 在循环之前预先计算重复使用的值(例如,
std::size_t halfsize = original.size()/2
而不是在循环内部反复计算 original.size()/2
)。特别是如果 original
不是 const
的话,因为 - 根据循环所做的事情 - 编译器很难确定它的大小是否会改变。
- 在循环内使用标准算法,而不是实现嵌套循环。
firstHalf.reserve(original.size() / 2 + 1)
可以使其更加高效。 - Jiahao Caifor (std::size_t i = 0, half = v.size() / 2; i != half; ++i) { f.push_back(v[i]); s.push_back(v[i + half]); }
怎么样? - Kerrek SB