[英]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.