Подтвердить что ты не робот

Есть ли функция для копирования массива в C/С++?

Я программист Java, изучающий C/С++. Поэтому я знаю, что Java имеет такую ​​функцию, как System.arraycopy(); для копирования массива. Мне было интересно, есть ли функция на C или С++ для копирования массива. Мне удалось найти реализацию для копирования массива, используя для цикла, указатели и т.д. Есть ли функция, которую я могу использовать для копирования массива?

4b9b3361

Ответ 1

Так как С++ 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

Ответ 2

Поскольку вы попросили решение 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));

Ответ 3

Как упоминалось выше, в C вы использовали бы memcpy. Обратите внимание, однако, что это делает необработанную копию памяти, поэтому, если ваши структуры данных имеют указатель на себя или друг на друга, указатели в копии по-прежнему будут указывать на исходные объекты.

В С++ вы также можете использовать memcpy, если ваши члены массива POD (то есть, по существу, типы, которые вы также могли бы использовать без изменений в C), но в целом memcpy не будет разрешено. Как упоминалось выше, используемая функция std::copy.

Сказав, что на С++ вы редко должны использовать необработанные массивы. Вместо этого вы должны использовать один из стандартных контейнеров (std::vector является самым близким к встроенному массиву, а также я думаю, что ближе всего к массивам Java - ближе, чем простые массивы С++, действительно, - но std::deque или std::list может быть более уместным в некоторых случаях) или, если вы используете С++ 11, std::array, который очень близок к встроенным массивам, но с семантикой значений, как и другие типы С++. Все типы, упомянутые здесь, могут быть скопированы путем назначения или создания копии. Кроме того, вы можете "перекрестно копировать" из 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;
}

Ответ 4

Вы можете использовать memcpy(),

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

memcpy() копирует значения num байтов из местоположения, на которое указывает source, непосредственно в блок памяти, на который указывает destination.

Если перекрытие destination и source перекрывается, вы можете использовать memmove().

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

memmove() копирует значения num байтов из местоположения, на которое указывает source, в блок памяти, на который указывает destination. Копирование происходит, как если бы использовался промежуточный буфер, позволяя месту назначения и источнику перекрываться.

Ответ 5

Используйте memcpy в C, std::copy в С++.

Ответ 6

В C вы можете использовать memcpy. В С++ используйте std::copy из заголовка <algorithm>.

Ответ 7

в С++ 11 вы можете использовать Copy(), который работает для контейнеров std

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;
}

Ответ 8

Я даю здесь два способа справиться с массивом, для языков C и С++. memcpy и copy оба применимы на С++, но копировать нельзя использовать для C, вы должны использовать memcpy, если вы пытаетесь скопировать массив в C.

#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;
}

Ответ 9

Во-первых, поскольку вы переключаетесь на С++, рекомендуется использовать вектор вместо традиционного массива. Кроме того, чтобы скопировать массив или вектор, std::copy - лучший выбор для вас.

Посетите эту страницу, чтобы узнать, как использовать функцию копирования: http://en.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());

Ответ 10

Просто включите стандартную библиотеку в свой код.

#include<algorithm>

Размер массива будет обозначен как n

Ваш старый массив

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

Объявите новый массив, в который нужно скопировать старое значение массива

int newArray[n];

Использовать этот

copy_n(oldArray,n,newArray);

Ответ 11

Мне нравится ответ Эд С., но это работает только для массивов фиксированного размера, а не тогда, когда массивы определены как указатели.

Итак, решение C++, где массивы определены как указатели:

    const int bufferSize = 10;
    char* origArray, newArray;
    std::copy(origArray, origArray + bufferSize, newArray);

Примечание: нет необходимости вычитать buffersize с 1:

1) Копирует все элементы в диапазоне [первый, последний), начиная с первого и заканчивая последним - 1

Смотрите: https://en.cppreference.com/w/cpp/algorithm/copy.