Используя 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 или что-то еще, если это широко используемая библиотека), тогда я приму ответ, который предоставит убедительные доказательства того, что такого решения не существует.
Если вы использовали векторы (и вы должны использовать 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);
Вы не можете добавить к обычным массивам в стиле C, как points
(на самом деле, я был бы удивлен, если бы объявление не генерировало ошибки компилятора). Попытка добавить к массиву в стиле C будет писать за пределами, что приводит к неопределенное поведение (и здесь я удивляюсь, что std::back_inserter
будет компилироваться при передаче массива в стиле C).
Вместо этого используйте std::vector
.
я хотел бы использовать 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);