簡體   English   中英

有沒有更慣用的方式來拆分std :: vector?

[英]Is there a more idiomatic way to split a std::vector?

我編寫了一個函數,將大小為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迭代器的要求向我表明,可能有更好的方法。

我唯一會做不同的事情是如何迭代以及如何將其追加到結果向量上:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM