使用C ++,我想创建一个只包含另一个数组的前n个元素的数组。像Scala中的那样:val arrayTwo = arrayOne.take(n)
我知道我可以使用循环并逐个复制元素,但这比必要复杂得多,它需要不必要的空间,这使得它的可读性降低。是否有一个简单,可读的函数从给定的前一个数组的前n个元素创建一个新数组?此外,我想从某个地方重用一个函数,而不是自己编写一个函数,因为我不想不必要地污染命名空间。只要需要O(n),性能就无所谓了。
std :: copy_n看起来像它,但我无法让它工作,因为std :: back_inserter由于某种原因不接受我的数组(我也试过用指针而不是数组,仍然不工作)。
这是我迄今为止的最佳尝试。
#include <iostream>
#include <utility>
#include <algorithm>
#include <vector>
#include <iterator>
#include <stdio.h>
#include <math.h>
using std::pair;
int main() {
pair<double, double> fabricatedPoints[] = { { 15.3, 12.9 }, { 88.6, 56.0 },
{ 0.4, 18.0 }, { 5.0, 3.13 }, { 2.46, 86.01 } };
pair<double, double> points[] = {};
std::copy_n(std::begin(fabricatedPoints), 3, std::back_inserter(points));
}
可以使用copy_n或其他方式完成,只要它是可读的,我不介意。如果库中没有可读解决方案(不一定是标准库 - 它也可能是Boost或其他东西,只要它是一个广泛使用的库),那么我会接受一个答案,它提供了令人信服的证据,证明没有这样的解决方案现有
答案 0 :(得分:5)
如果你使用的是矢量(你应该使用C ++),你可以这样做:
using std::vector;
vector<pair<double, double>> a{ {15.3, 12.9}, ...};
vector<pair<double, double>> b(a.begin(), a.begin() + 3);
对于数组,您必须确保将数组预分配到正确的大小:
pair<double, double> b[3];
std::copy_n(a, 3, b);
答案 1 :(得分:1)
你不能追加到points
这样的普通C风格数组(实际上,如果声明没有产生编译错误,我会感到惊讶)。试图附加到C风格的数组会超出界限,导致undefined behavior(这里我也很惊讶std::back_inserter
在传递C风格的数组时会编译。“ / p>
而是使用std::vector
。
答案 2 :(得分:0)
我会将vector
用于此
vector<int> vec1;
vector<int> vec2;
vector<int> merged;
//insert(where you want to start adding, from which index, to which index)
//in this case we are adding the first to n-th elements from vec1 to the last element of merged
merged.insert(merged.end(), vec1.begin(), vec1.begin() + n);
//here we are adding the m-th to n-th elements of vec2 to the first element of merged
merged.insert(merged.begin(), vec2.begin() + m, vec2.begin() + n);