将两个数组整合的方法(4种)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将两个数组整合的方法(4种)相关的知识,希望对你有一定的参考价值。
参考技术A 需要遍历整合的 最好长度大的整合长度小的值 减少遍历次数 节约性能方法一:concat (多次数组合并会造成内存浪费)
方法二:for of (遍历的是数组的值)
方法三:for in (遍历的是数组的下标)
方法三:apply
调用arr2.push这个函数实例的apply方法,同时把arr1当作参数传入,这样arr2.push这个方法就会遍历arr1数组的所有元素达到合并的效果,也会改变数组本身的值
方法四:ES6 扩展运算符
将向量拆分为两个较小数组的最佳方法?
【中文标题】将向量拆分为两个较小数组的最佳方法?【英文标题】:Best way to split a vector into two smaller arrays? 【发布时间】:2012-04-06 08:41:46 【问题描述】:我想做的事:
我正在尝试将向量拆分为两个单独的数组。当前的 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;
谢谢你:)
【问题讨论】:
我会推荐来自<algorithm>
标头 (en.cppreference.com/w/cpp/algorithm) 的内容。 std::copy
或 std::move
可能会感兴趣。
我喜欢这个问题的提问方式。您不会经常看到新用户提出这样的结构化问题。
如果你不打算改变2个数组的大小,可以看看array_view
【参考方案1】:
使用迭代器。
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 类型来说很时髦,而且通常没有用处,因为您甚至无法返回它们。
【讨论】:
非常好的答案,+1 表示“您不需要将 1 添加到第二个开始迭代器”【参考方案2】:如果您只需要引用数字而不对其进行操作,那么您可以这样做:
int *array_1 = &lines[0];
int *array_2 = &lines[lines.size() / 2];
array_1 和array_2 实际上是指向向量开始和中间的指针。这是可行的,因为 STL 保证向量将它们的元素存储在连续的内存中。 请注意,引用lines.begin() 不能用于此。
【讨论】:
【参考方案3】:如果您由于严格的编译器规则而无法使用来自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());
【讨论】:
【参考方案4】:使用迭代器将向量拆分为可变计数部分的解决方案。
#include <iostream>
#include <vector>
int main()
// Original vector of data
std::vector<double> mainVec1.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";
【讨论】:
以上是关于将两个数组整合的方法(4种)的主要内容,如果未能解决你的问题,请参考以下文章