I suggest something pretty general (it works with different containers and different types, in this case the complexity will change):
#include <algorithm> #include <iterator> #include <vector> template<typename Vector> auto split_vector(const Vector& v, unsigned number_lines) { using Iterator = typename Vector::const_iterator; std::vector<Vector> rtn; Iterator it = v.cbegin(); const Iterator end = v.cend(); while (it != end) { Vector v; std::back_insert_iterator<Vector> inserter(v); const auto num_to_copy = std::min(static_cast<unsigned>( std::distance(it, end)), number_lines); std::copy(it, it + num_to_copy, inserter); rtn.push_back(std::move(v)); std::advance(it, num_to_copy); } return rtn; }
You can specify the number of lines you want to split:
For instance:
int main(int argc, char *argv[]) { std::vector<std::string> input_vector = {"First", "Second", "Third"}; auto vs = split_vector(input_vector, 2); return 0; }
It will generate two vectors: {"First", "Second"} and {"Third"} .
source share