2012-06-19 39 views
8

Bu soru C# içinde sorulan sorudur ama C++ için ihtiyacım varDizinin bir bölümünü C++ içindeki başka bir diziye nasıl kopyalarım?

Dizinin bir bölümünü başka bir diziye nasıl kopyalarım?

başka diziye kopyalanır almalısınız bir ben dizinin başlangıç ​​indeksi ve bitiş indeksi verirsem Şimdi

int[] a = {1,2,3,4,5}; 

yaşıyorum düşünün.

Başlangıç ​​dizini 1 ve bitiş dizini 3 olarak verirsem, 2, 3, 4 öğeleri yeni dizide kopyalanmalıdır. C# '

o

 int[] b = new int[3]; 
    Array.Copy(a, 1, b, 0, 3); 

C++ aynı görevi yapmak için bu gibi herhangi bir basit bir yolu var mı şu şekilde yapılır?

+3

Daha da iyisi, ilk sıradaki diziler yerine 'std :: vector' kullanın. Diğer birçok harika özellik arasında yaptığınız şeyi yapan bir kurucuya sahiptir. – chris

cevap

10

Evet, std::copy kullanın:

std::copy(a + src_begin_index, 
      a + src_begin_index + elements_to_copy, 
      b + dest_begin_index); 

C# örnek eşdeğer olacaktır: basit C tarzı diziler için

std::copy(a + 1, a + 4, b); 
+2

Sadece hedefinizin sınırlarını aşmadığınızdan emin olun! –

+2

Teşekkürler @ RichardJ.RossIII. Harika çalışıyor. –

+1

"copy_n" için giderdim ...'std :: copy_n (a + src_begin_index, elements_to_copy, b + dst_begin_index)' –

0

sen memcpy kullanabilirsiniz:

memcpy(b, &a[1], sizeof(int) * 3); 

Bu satır, dizin 1'den sizeof(int) * 3 bayt (yani 12 bayt) kopyalar a, hedef olarak b ile birlikte.

böyle kullanabilirsiniz C memcpy komutu vardır
1

:

memcpy(destinationArray, sourceArray, sizeof(*destinationArray) * elementsToCopy); 

da std::copy vardır, bunu yapmanın daha C++ yoludur:

std::copy(source, source + elementsInSource, destination); 

Not ki, ne Bu işlevlerin yeterli bellek ayrıldığından emin olmak için kontrol edin, bu yüzden kendi riski altında kullanın!

+0

'std: copy' kullanımı yanlıştır, çünkü ikinci argüman bir-son-bit (' source + elementsInSource') olmalıdır. , -1 –

+0

@DaveS ok olmadan, teşekkürler. Bir süredir C++ kullanmamıştım, bunun için teşekkürler. –

0

Evet, st standart kütüphane algoritması copy kullanarak: C# örnekte olduğu gibi bir dinamik olarak ayrılan bir dizi istiyorum varsayarsak

#include <algorithm> 

int main() 
{ 
    int array[5] = { 1,2,3,4,5 }; // note: no int[] array 
    int *b = new int[3]; 
    std::copy(array+1, array+4, b); 
    // copies elements 1 (inclusive) to 4 (exclusive), ie. values 2,3,4 
} 
2

, en basit yoludur:

std::vector<int> b(a.begin() + 1, a.begin() + 4); 

Bu aynı zamanda sahiptir tahrip edildiğinde tahsis edilen belleği otomatik olarak bırakması avantajı; new'u kullanırsanız, bellek sızıntılarını önlemek için delete'u da kullanmanız gerekir.

İlgili konular