首页 > 解决方案 > 是否有一个 C++ 函数可以将向量分成三个单独的向量?

问题描述

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

标签: c++algorithmstdvector

解决方案


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

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

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

当项目的数量以绝对数字给出时,就不会出现上述问题,您可以编写一个通用算法,用源向量中的( ) 个元素填充向量nm_i0<=i<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);

推荐阅读