是否有一个 C++ 函数可以将向量分成三个独立的向量?

Is there a C++ function which enables to divide vector into three seperate vectors?

我正在寻找一种解决方案,将向量分成 3 个具有元素比例的独立向量 9:1:1,例如,如果我们在原始向量中有 1100 个元素,那么我希望得到 3 个连续 900、100 个元素的向量和 100 个元素。有一个函数 std::partition_copy,但是它只将数据复制到 2 个单独的向量。

没有这方面的标准功能。 return 的功能是什么?更多向量的向量?这对于解决问题的家庭解决方案来说很好,但我觉得标准委员会不会对这样做的功能感到满意。或者,如果要将迭代器带到目标向量,有多少个目标向量?这些东西将被定义。而且我认为委员会也不会乐意为每个输出向量数量制作 N 个新算法。

然而,您可以推出自己的函数,广泛使用部分向量复制:

std::vector<int> newVec(oldVec.begin(), oldVec.begin() + 8);
// copies the first 8 elements of oldVec into newVec

没有标准算法可以直接做你想做的事。我想有太多的特殊情况需要考虑。比如初始向量只有eg 9个元素时,如何按照9:1:1分配元素?每个分区应该至少包含 1 个元素吗?结果应该是 7:1:1 还是 8:1:0?

但是,您可以使用带有两个迭代器的 std::vectors 构造函数:

#include <vector>
#include <iostream>
#include <numeric>

int main() {
    
    std::vector<int> v(10);
    std::iota(v.begin(),v.end(),0);

    size_t mid1 = v.size()*0.8;
    size_t mid2 = mid1+v.size()*0.1;

    std::vector<int> v1{v.begin(),v.begin()+mid1};
    std::vector<int> v2{v.begin()+v1.size(),v.begin()+mid2};
    std::vector<int> v3{v.begin()+v1.size()+v2.size(),v.end()};

    for (const auto& e : v1) std::cout << e << " ";
    std::cout << "\n";
    for (const auto& e : v2) std::cout << e << " ";
    std::cout << "\n";
    for (const auto& e : v3) std::cout << e << " ";
    std::cout << "\n";
}

当项目数量以绝对数字给出时,上述问题就不会出现,您可以编写一个通用算法,用 m_i (0<=i<n) 个元素填充 n 向量来自源向量。

最后但同样重要的是,考虑复制整个向量,只是为了能够访问它的子范围,这不是很惯用的。与其创建包含部分元素的新向量,不如重构处理这些子范围的方法以采用迭代器而不是向量,即

 template <typename Iterator>
 void do_something_with_vector_elements(Iterator begin,Iterator end);

而不是

 void do_something_with_all_vector_elements(const std::vector<int>& v);