2014-01-22 3 views
0

Я рассматриваю новый для C++, и у меня есть некоторые сомнения в слиянии трех наборов массивов. Например:Объединение 3 наборов массивов

x = 2,3,1,4,5 
y = 1,3,5,7,9 
z = 3,5,4,6,1 

Я хотел бы объединить их в:

w = 2,1,3,3,3,5,1,5,4,4,7,6,5,9,1 

Я искал через Google. Однако я получаю, как объединить массивы и поместить их в порядке возрастания.

Что я на самом деле нужно:

1st from x, 1st from y, 1st from z, 2nd from x, 2nd from y, 2nd from z ............ 5th from z 

Большое спасибо!

+0

Что произойдет, если массивы разных размеров? –

+3

Какой тип ваших массивов? 'std :: vector '? '' INT *? –

+1

@LaurentLARIZZA Если массивы разных размеров ... он не говорит, поэтому у нас недостаточно информации для ответа на вопрос. –

ответ

2

Это просто вопрос создания петли с i от 0 к 4 и отображение каждого i к соответствующему элементу массива w.

Вот скелет алгоритма:

std::array<int, 5> x, y, z; 
std::array<int, 15> w; 
for (int i = 0; i < 5; i++) { 
    w[i*3] = x[i]; 
    w[i*3+1] = y[i]; 
    w[i*3+2] = z[i]; 
} 

И here «s рабочий пример.


Если вы используете std::vector, то алгоритм становится немного сложнее. Вам нужно будет найти максимальный размер, например, с помощью std::max и выполнить цикл на основе этого значения. Тогда всякий раз, когда вектор пуст, вам нужно пропустить его. Вот скелет снова:

std::vector<int> x, y, z; 
std::vector<int> w; 
std::size_t max = std::max({x.size(), y.size(), z.size()}); 
for (std::size_t i = 0; i < max; i++) { 
    if (x.size() > i) w.push_back(x[i]); 
    if (y.size() > i) w.push_back(y[i]); 
    if (z.size() > i) w.push_back(z[i]); 
} 
+0

Размер массива случайный. – Marcus

+0

@Marcus, какой тип «массив»? – Shoe

+0

Что вы подразумеваете под типами? он состоит только из целочисленного – Marcus

1

До тех пор, как вы знаете размер х, у, г и ш, это довольно простое решение.

В C++, в отличие от других языков программирования более высокого уровня, большинство операций на основе массивов не обрабатываются специальными функциями. Вместо этого пользователь должен написать цикл для выполнения этой задачи самостоятельно.

В вашем случае, предполагая, что х, у, г, а вес все объявлены и определены правильно, то самый простой способ, вероятно, использует для цикла следующим образом:

int i; 
for(i=0; i<(size_of_x); i++){ 

    w[i*3] = x[i]; 
    w[i*3+1] = y[i]; 
    w[i*3+2] = z[i]; 

} 

Обратите внимание, что для этого необходимо определить переменную size_of_x.

+1

Последняя строка 'w [i * 3 + 2] = x [i];' должна быть 'w [i * 3 + 2] = z [i];' –

+0

Спасибо. Редактирование, чтобы исправить опечатку. – Glenn

1

Как насчет некоторых C++ 11?

#include <vector> 
int main() 
{ 

    std::vector<int> x {2,3,1,4,5}, y {1,3,5,7,9}, z {3,5,4,6,1}; 
    std::vector<int> w; 
    for (int i {}; i < x.size(); ++i) 
    { 
     w.insert(v.end(),{x[i], y[i], z[i]}); 
    } 
} 
+0

Итак, для вас, C++ 11 является синонимом «инициализации скобок»? Также не используйте 'using namespace std'. – Shoe

+0

Нет, но для моего решения требуется компилятор с поддержкой C++ 11, и почему бы не использовать «пространство имен» для этого небольшого примера? – erlc

+0

Можете ли вы удалить «using namespace std», чтобы я мог удалить downvote? – Shoe

1

Возможно, вы также захотите рассмотреть тот факт, что длины массивов могут отличаться.

int *resArray; 
int totalLength = sizeof(x) + sizeof(y) + sizeof(z); 
int maxLength = max(sizeof(x), max(sizeof(y), sizeof(x)); 

resArray = new int[totalLength]; 

int j = 0; 

for (int i = 0; i < maxLength; i++) 
{ 
    if (i < sizeof(x)) 
    { 
     resArray[j] = x[i]; 
     j++ 
    } 
    if (i < sizeof(y)) 
    { 
     resArray[j] = y[i]; 
     j++ 
    } 
    if (i < sizeof(z)) 
    { 
     resArray[j] = z[i]; 
     j++ 
    } 
} 

Это не будет самое быстрое решение, но оно может обрабатывать массивы разной длины.

Edit:

Не забудьте освободить память вы выделенную с помощью new. И вы можете рассмотреть использование std :: vector

+0

'sizeof' для размера исходных массивов? –

+1

@JamesKanze мой C++ может быть немного ржавым, но вы правы. Это позволит получить только количество байтов, выделенных массивами. Вам по-прежнему нужно разделить его на размер одного элемента. – RFerwerda

+0

В C++ обычным типом для массива является 'std :: vector '; 'sizeof' совершенно не имеет значения. И даже для массивов стилей C этот код будет в функции, которая будет передана массивами, поэтому 'sizeof' даст вам количество байтов в указателе. –

Смежные вопросы