簡體   English   中英

將矢量分成兩個較小數組的最佳方法是什么?

[英]Best way to split a vector into two smaller arrays?

我正在嘗試做什么:

我試圖將一個矢量分成兩個獨立的數組。 當前int向量包含文本文件中每行的元素。 文本文件是隨機整數列表。

我打算怎么做:

我目前的想法是創建兩個常規int數組,然后迭代整個向量並將n / 2個元素復制到每個數組。

我想知道的是:

完成任務的最優雅方式是什么? 我有一種感覺,我可以做到這一點,而無需多次迭代矢量。

碼:

#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
using namespace std;

vector<int> ifstream_lines(ifstream& fs)
{
  vector<int> out;
  int temp;
  while(fs >> temp)
  {
    out.push_back(temp);
  }
  return out;
}

vector<int> MergeSort(vector<int>& lines)
{
  int split = lines.size() / 2;
  int arrayA[split];
  int arrayB[split];
}

int main(void) 
{
  ifstream fs("textfile.txt");
  vector<int> lines;
  lines = ifstream_lines(fs);

  return 0;
}

謝謝 :)

使用迭代器。

std::vector<int> lines;
// fill
std::size_t const half_size = lines.size() / 2;
std::vector<int> split_lo(lines.begin(), lines.begin() + half_size);
std::vector<int> split_hi(lines.begin() + half_size, lines.end());

由於迭代器范圍代表半開放范圍[begin, end) ,因此您不需要向第二個開始迭代器添加1: lines.begin() + half_size不會復制到第一個向量。


注意事情就好

int split = lines.size() / 2;
int arrayA[split];
int arrayB[split];

不是標准的C ++(因此不可移植)。 這些是所謂的可變長度數組(簡稱VLA),是C99的東西。 一些編譯器在編譯C ++代碼(GCC,Clang)時將它們作為擴展。 始終使用-pedantic進行編譯以獲得警告。 這些VLA對非POD類型起作用,並且通常不常用,因為您甚至無法返回它們。

如果由於嚴格的編譯規則而無法使用Xeo中的代碼,或者您想要更通用的方法,請嘗試使用std::advance

#include <vector>
#include <iterator>

size_t middle = input.size()/2;
std::vector<int>::const_iterator middleIter(input.cbegin());
std::advance(middleIter, middle);

std::vector<int> leftHalf(input.begin(), middleIter);
std::vector<int> rightHalf(middleIter, input.end());

如果您只需要對數字進行引用而不進行操作,那么您可以:

int *array_1 = &lines[0];
int *array_2 = &lines[lines.size() / 2];

實際上,array_1和array_2是指向矢量開始和中間的指針。 這是有效的,因為STL保證向量將它們的元素存儲在連續的內存中。 請注意,引用lines.begin()不能用於此。

使用迭代器將向量拆分為可變計數部分的解決方案。

#include <iostream>
#include <vector>

int main()
{
   // Original vector of data
   std::vector<double> mainVec{1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0};
   // Result vectors
   std::vector<std::vector<double>> subVecs{};
   // Start iterator
   auto itr = mainVec.begin();
   // Variable to control size of non divided elements
   unsigned fullSize = mainVec.size();
   // To regulate count of parts
   unsigned partsCount = 4U;
   for(unsigned i = 0; i < partsCount; ++i)
   {
       // Variable controls the size of a part
       auto partSize = fullSize / (partsCount - i);
       fullSize -= partSize;
       // 
       subVecs.emplace_back(std::vector<double>{itr, itr+partSize});
       itr += partSize;
   }
   // Print out result
   for (const auto& elemOuter : subVecs)
   {
       std::cout << std::fixed;
       for (const auto& elemInner : elemOuter)
       {
           std::cout << elemInner << " ";
       }
       std::cout << "\n";
   }
}

暫無
暫無

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

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