我编写了一个函数,将大小为N的向量拆分为不超过大小M的块。
因此,给定一个大小为47,大小为10的向量,我们得到5个大小的块:10,10,10,10,7。
template<typename T> std::vector<std::vector<T>> chunkVector(typename std::vector<T> source, typename std::vector<T>::size_type chunkSize)
{
typename std::vector<std::vector<T>> returnVector;
for (typename std::vector<T>::size_type i = 0; i < source.size(); i += chunkSize) {
typename std::vector<T>::iterator start = source.begin() + i;
typename std::vector<T>::iterator end = start + chunkSize > source.end() ? source.end() : start + chunkSize;
typename std::vector<T> tempVector(start, end);
returnVector.push_back(tempVector);
}
return returnVector;
}
有更惯用的方法吗? random_access迭代器的要求告诉我可能有更好的方法。
答案 0 :(得分:3)
我唯一不同的是如何迭代,以及我们如何追加结果向量:
template<typename T>
std::vector<std::vector<T>> chunkVector(const std::vector<T>& source, size_t chunkSize)
{
std::vector<std::vector<T>> result;
result.reserve((source.size() + chunkSize - 1) / chunkSize);
auto start = source.begin();
auto end = source.end();
while (start != end) {
auto next = std::distance(start, end) <= chunkSize
? start + chunkSize
: end;
result.emplace_back(start, next);
start = next;
}
return result;
}