簡體   English   中英

將向量拆分成新的更小尺寸的向量

[英]Split vector into new smaller size vectors

問題

我有向量V = {1,2,3,4,5,6,7,8,9,10,11}並假設我想從這個大向量創建N新向量。

示例: N = 3表示它將按最大可用大小拆分向量,即4-4-3
v1 = {1,2,3,4}
v2 = {5,6,7,8}
v3 = {9,10,11}

代碼

std::vector<int> v;
for (int i = 1; i < 12; i++) v.push_back(i);   

// Function here to set boundaries ???
N = 3;
v.size()/N % N
//
std::vector<int> v1(v.begin(), v.begin()+3);
std::vector<int> v2(v.begin()+4, v.begin()+7);
std::vector<int> v3(v.begin()+8, v.begin()+11);

想要達到

  1. Function 會自行自動創建向量,所以如果可能的話,我不想手動創建v1,v2,v3
  2. 以及如何編寫邊界檢查算法?

如果你像這樣分成n個塊,你會得到第 i 個vec塊:

template <typename T>
std::span<T> get_chunk(std::vector<T> const & vec, std::size_t n, std::size_t i)
{
  assert(i < n);
  std::size_t const q = vec.size() / n;
  std::size_t const r = vec.size() % n;
  
  auto begin = vec.begin() + i * q + std::min(i, r);
  auto end = vec.begin() + (i + 1) * q + std::min(i + 1, r);
  
  return std::span<T>(begin, end);
}

如果您不/不能使用std::span ,只需將其替換為std::vector或直接使用beginend -iterators。

Function 會自行自動創建向量,所以如果可能的話,我不想手動創建 v1、v2、v3。

什么是可以容納 N 個對象的數據結構? 數組呢? 但是您可能希望在運行時確定大小。 你怎么能創建一個運行時大小的數組? 總之,使用向量。 編寫一個 function 來創建向量的向量。

請注意,與其使用單獨的向量,不如保持原始向量完整並使用std::span的向量(在 C++20 之前,您可以使用相同概念的非標准實現)指向可能更有效到子范圍。

一個簡單的方法是建立一個vectorvector來收集不同的arrays。

為了控制邊界,一種可能是首先計算這些 arrays 的最大大小,然后管理兩個索引,一個ibegin對應於子數組的開頭,一個iend對應於同一子數組的結尾。

Output:

1 2 3 4
5 6 7 8
9 10 11

代碼:

#include <iostream>
#include <vector>

std::vector<std::vector<int>> split (const std::vector<int>& v, int Nsplit) {
    int n = v.size();
    int size_max = n / Nsplit + (n % Nsplit != 0);
    std::vector<std::vector<int>> split;
    for (int ibegin = 0; ibegin < n; ibegin += size_max) {
        int iend = ibegin + size_max;
        if (iend > n) iend = n;
        split.emplace_back (std::vector<int>(v.begin() + ibegin, v.begin() + iend));
    }
    return split;
}

int main() {
     std::vector<int>Arr = {1,2,3,4,5,6,7,8,9,10,11};
     int Nsplit = 3;
     auto ans = split (Arr, Nsplit);
     
    for (auto &v: ans) {
        for (auto& i: v) {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

暫無
暫無

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

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