web-dev-qa-db-ja.com

C / C ++で配列をコピーする機能はありますか?

私はC/C++を学ぶJavaプログラマーです。だから私はJavaがSystem.arraycopy()のような機能を持っていることを知っています。配列をコピーします。私は、配列をコピーするための関数がCまたはC++にあるかどうか疑問に思いました。 forループやポインタなどを使って配列をコピーする実装しか見つけることができませんでした。配列をコピーするために使用できる関数はありますか?

68
J L

C++ 11以降、std::arrayを使用して配列を直接コピーできます。

std::array<int,4> A = {10,20,30,40};
std::array<int,4> B = A; //copy array A into array B

これは std :: array についてのドキュメントです。

62
taocp

あなたがC++ソリューションを要求して以来...

#include <algorithm>
#include <iterator>

const int arr_size = 10;
some_type src[arr_size];
// ...
some_type dest[arr_size];
std::copy(std::begin(src), std::end(src), std::begin(dest));
109
Ed S.

他の人が言ったように、Cではmemcpyを使うでしょう。ただし、これは生のメモリコピーを実行するため、データ構造が自分自身または互いへのポインタを持っている場合でも、コピー内のポインタは元のオブジェクトを指すことになります。

C++では、配列メンバがPOD(つまり、Cでもそのまま使用できる型)の場合はmemcpyを使用することもできますが、一般に、memcpynotになります。/許可されている。他の人が述べたように、使用する関数はstd::copyです。

とは言っても、C++では、ロー配列を使うべきではありません。代わりに、どちらかの標準コンテナを使用する必要があります(std::vectorは組み込み配列に最も近いものであり、また、通常のC++配列よりも近い - Java配列に最も近いと思います)。ただし、std::dequeまたはstd::listはより適切です。場合によっては)またはC++ 11を使用している場合、std::arrayは組み込み配列に非常に近いが、他のC++型のような値の意味を持つ。ここで述べたタイプはすべて代入またはコピー構成によってコピーできます。さらに、反復子構文を使用して、opneから別のもの(さらには組み込み配列から)に「クロスコピー」することができます。

これは可能性の概観を与えます(私はすべての関連ヘッダーが含まれていると思います):

int main()
{
  // This works in C and C++
  int a[] = { 1, 2, 3, 4 };
  int b[4];
  memcpy(b, a, 4*sizeof(int)); // int is a POD

  // This is the preferred method to copy raw arrays in C++ and works with all types that can be copied:
  std::copy(a, a+4, b);

  // In C++11, you can also use this:
  std::copy(std::begin(a), std::end(a), std::begin(b));

  // use of vectors
  std::vector<int> va(a, a+4); // copies the content of a into the vector
  std::vector<int> vb = va;    // vb is a copy of va

  // this initialization is only valid in C++11:
  std::vector<int> vc { 5, 6, 7, 8 }; // note: no equal sign!

  // assign vc to vb (valid in all standardized versions of C++)
  vb = vc;

  //alternative assignment, works also if both container types are different
  vb.assign(vc.begin(), vc.end());

  std::vector<int> vd; // an *empty* vector

  // you also can use std::copy with vectors
  // Since vd is empty, we need a `back_inserter`, to create new elements:
  std::copy(va.begin(), va.end(), std::back_inserter(vd));

  // copy from array a to vector vd:
  // now vd already contains four elements, so this new copy doesn't need to
  // create elements, we just overwrite the existing ones.
  std::copy(a, a+4, vd.begin());

  // C++11 only: Define a `std::array`:
  std::array<int, 4> sa = { 9, 10, 11, 12 };

  // create a copy:
  std::array<int, 4> sb = sa;

  // assign the array:
  sb = sa;
}
66
celtschk

memcpy()を使うことができます、

void * memcpy ( void * destination, const void * source, size_t num );

memcpy()は、numが指す場所からsourceが指すメモリブロックに、destinationバイトの値を直接コピーします。

destinationsourceが重なっている場合は、memmove()を使用できます。

void * memmove ( void * destination, const void * source, size_t num );

memmove()は、numが指す場所からsourceが指すメモリブロックにdestinationバイトの値をコピーします。コピーは中間バッファが使用されているかのように行われ、コピー先とコピー元が重なることを可能にします。

18
Deepu

Cではmemcpy、C++ではstd::copyを使用してください。

16
Mehrdad

Cではmemcpyを使うことができます。 C++では、std::copyヘッダーから<algorithm>を使用します。

10
Pete Becker

c ++ 11では、stdコンテナに対して機能するCopy()を使うことができます。

template <typename Container1, typename Container2>
auto Copy(Container1& c1, Container2& c2)
    -> decltype(c2.begin())
{
    auto it1 = std::begin(c1);
    auto it2 = std::begin(c2);

    while (it1 != std::end(c1)) {
        *it2++ = *it1++;
    }
    return it2;
}
3
MORTAL

ここでは、C言語とC++言語の2つの配列の対処方法を示します。 memcpycopy 両方ともC++では使えますが、copyはCでは使えません、 Cで配列をコピーしようとしている場合は、memcpyを使用します。

#include <stdio.h>
#include <iostream>
#include <algorithm> // for using copy (library function)
#include <string.h> // for using memcpy (library function)


int main(){

    int arr[] = {1, 1, 2, 2, 3, 3};
    int brr[100];

    int len = sizeof(arr)/sizeof(*arr); // finding size of arr (array)

    std:: copy(arr, arr+len, brr); // which will work on C++ only (you have to use #include <algorithm>
    memcpy(brr, arr, len*(sizeof(int))); // which will work on both C and C++

    for(int i=0; i<len; i++){ // Printing brr (array).
        std:: cout << brr[i] << " ";
    }

    return 0;
}
2
Fake_Death

まず、C++に切り替えているので、従来の配列の代わりにvectorを使用することをお勧めします。その上、配列やベクトルをコピーするためには、std::copyがあなたにとって最良の選択です。

コピー機能の使い方については、このページを参照してください。 http://ja.cppreference.com/w/cpp/algorithm/copy

例:

std::vector<int> source_vector;
source_vector.Push_back(1);
source_vector.Push_back(2);
source_vector.Push_back(3);
std::vector<int> dest_vector(source_vector.size());
std::copy(source_vector.begin(), source_vector.end(), dest_vector.begin());

コードに標準ライブラリを含めるだけです。

#include<algorithm>

配列サイズはnとして表されます

あなたの古い配列

int oldArray[n]={10,20,30,40,50};

古い配列値をコピーする必要がある新しい配列を宣言します。

int newArray[n];

これを使って

copy_n(oldArray,n,newArray);
0
Ankit Singh