web-dev-qa-db-ja.com

ベクトルを2つの小さな配列に分割する最良の方法は?

私がやろうとしていること:

ベクトルを2つの別々の配列に分割しようとしています。現在のintベクトルには、テキストファイルの行ごとの要素が含まれています。テキストファイルは、ランダムな整数のリストです。

私がそれをどのように計画しているのか:

私の現在のアイデアは、2つの通常の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;
}

ありがとうございました :)

24
mightcouldb1

Xeo answerからのコードを使用できない場合、厳密なコンパイラルールのため、またはより一般的な方法が必要な場合は、 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());
2
iamantony

それらを操作せずに数値への参照のみが必要な場合は、次のことができます。

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

array_1とarray_2は、実際には、ベクトルの開始点と中間点へのポインターです。これは、STLがベクトルの要素を連続メモリ内に格納することを保証するために機能します。 lines.begin()を参照することはこれに使用できないことに注意してください。

2
Israel Unterman

イテレータを使用してベクトルを可変カウントパーツに分割するソリューション。

#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";
   }
}
1
R.Mazgutov