সি / সি ++ এ অ্যারে অনুলিপি করার জন্য কোনও ফাংশন রয়েছে?


92

আমি জাভা প্রোগ্রামার সি / সি ++ শিখছি। সুতরাং আমি জানি যে জাভাতে সিস্টেম.আর্রয়কপি () এর মতো একটি ফাংশন রয়েছে; একটি অ্যারে অনুলিপি করতে। আমি ভাবছিলাম যে কোনও অ্যারে অনুলিপি করতে সি বা সি ++ তে কোনও ফাংশন রয়েছে কিনা। আমি কেবল লুপ, পয়েন্টার ইত্যাদির জন্য একটি অ্যারে অনুলিপি করার জন্য প্রয়োগগুলি খুঁজে পেতে সক্ষম হয়েছি। আমি কোন অ্যারে অনুলিপি করতে ব্যবহার করতে পারেন এমন কোন ফাংশন আছে?


7
man memmoveএবংman memcpy
টিম কুপার

28
ব্যবহার করবেন না memcpy, ব্যবহার করুন std::copy। আপনার টাইপটির যদি অর্থপূর্ণ অনুলিপি নির্মাণকারী থাকে তবে memcpyভুল কাজটি করবে।
এড এস

10
আপনি কি একই সাথে সি এবং সি ++ শিখার চেষ্টা করছেন? এগুলি খুব আলাদা ভাষা।
ফেরুকসিও

4
ঠিক আছে আমি সামান্য কিছুটা সি শিখেছি এবং এখন আমি সম্প্রতি সি ++ শিখতে শুরু করেছি। একটি অনলাইন সংস্থান থেকে যা পড়েছি তা থেকে, আমি ভেবেছিলাম সি ++ কেবলমাত্র একটি ভাষা যা সি ভাষার আরও অনেকগুলি অতিরিক্ত বৈশিষ্ট্যযুক্ত।
জেএল

6
আমি এটি বলছি কারণ এটির আগে কেউ এর উল্লেখ না করে: সি ++ তে আপনার প্রায় সব ক্ষেত্রেই স্টাড :: ভেক্টর ব্যবহার করা উচিত। এমন কিছু ক্ষেত্রে রয়েছে যেখানে অন্যান্য ধারকগুলিও ব্যবহারযোগ্য, তবে আমি বেশিরভাগ ক্ষেত্রে স্ট্যান্ড :: ভেক্টর সেরা বিকল্প হবে। সি ++ এ কাঁচা অ্যারে ব্যবহার করবেন না এবং প্রয়োজনীয় না হলে std :: অ্যারে এড়ানোর চেষ্টা করবেন না।
স্কাল্লি

উত্তর:


79

সি ++ ১১ যেহেতু আপনি সরাসরি অ্যারেগুলি অনুলিপি করতে পারেন std::array:

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

এখানে স্ট্যান্ড :: অ্যারে সম্পর্কে ডকুমেন্টেশন রয়েছে


@ এক্সএলএক্সএক্সওএনজেডএক্স: একইভাবে আপনি অন্য কোনও ধরণের যা অনুলিপি অ্যাসাইনমেন্ট সমর্থন করে। B = A
সোয়াগল

4
আমি মনে করি ফাংশনটি এ এর ​​মেমরি ঠিকানাটি বি তে অনুলিপি করে যদি আমি বি এর মেমরি ঠিকানা পরিবর্তন না করে A এর আইটেমের মানগুলি কপি করার চেষ্টা করি। আমি এটা কিভাবে করবো?
অ্যারন লি

@ অ্যারন_লি: আমি কেবল এটি পরীক্ষা করেছি এবং এটি সত্যই উপাদানগুলি একটি আলাদা মেমরির স্থানে অ্যারেতে অনুলিপি করে। স্পষ্টতই অ্যারে শ্রেণীর অ্যাসাইনমেন্ট অপারেটরের জন্য নিজস্ব ওভারলোড রয়েছে।
ডেভ রোভ

4
আপনি ছেলেরা বুঝতে পারেন যে কোনও অ্যাসাইনমেন্ট অপারেটররা কোডের এই দুটি লাইনে উপস্থিত হয়নি? স্বরলিপিটি অ্যাসাইনমেন্ট অপারেটরের মতো দেখানো সত্ত্বেও এটিই অনুলিপি নির্ধারক is
অ্যালবিনো কর্ডেরিও

139

যেহেতু আপনি একটি সি ++ সমাধান চেয়েছিলেন ...

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

4
ত্রুটি: 'শুরু' 'স্ট্যান্ড' এর সদস্য নয়
ডেভিড 天宇 ওয়াং

23
@ ডেভিড 天宇 ওয়াং: আপনি একটি পুরানো সংকলক ব্যবহার করছেন বা আপনি শিরোনামটি অন্তর্ভুক্ত করেননি। এটি<iterator>
এড এস

9
হতে পারে আপনার বলা উচিত যা আপনার প্রয়োজন অন্তর্ভুক্ত। কপি আছে <algorithm>?
জেরি যেরেমিয়া

15
আমি কেবল তাই জিজ্ঞাসা করি কারণ যদি আপনাকে ব্যাখ্যা করতে হত যে স্টাড :: শুরুটি <iterator> এ ছিল তার মানে লোকেরা স্টুডল গুগল করছে না :: এটি কোন শিরোনামে রয়েছে তা খুঁজে বের করতে শুরু করুন যাতে তারা গুগল স্টাড :: এর অনুলিপি করার সম্ভাবনা নেই কারণ যদি কারও কাছে এমন মন্তব্য জিজ্ঞাসা না করতে হয় যা কেবলমাত্র মন্তব্যে উত্তর দেওয়া হয় তবে এটি আরও ভাল উত্তর দেয়। আপনাকে উত্তর দেওয়ার পরিবর্তে আমার উত্তরটি সম্পাদনা করা উচিত ছিল।
জেরি যেরেমিয়া

4
আপনি আরসিআর (আরসিআর) এসসিআর এবং সিআরসি + এআর_সাইজে (এসসিআর) শেষ করতে পারবেন
ক্যালভিন

82

অন্যরা যেমন উল্লেখ করেছে, সি তে আপনি ব্যবহার করবেন memcpy। তবে এটি একটি কাঁচা মেমরি অনুলিপি করে তা নোট করুন, সুতরাং আপনার ডেটা স্ট্রাকচারগুলিতে যদি নিজের বা একে অপরের দিকে পয়েন্টার থাকে তবে অনুলিপিটির পয়েন্টারগুলি এখনও মূল বস্তুগুলিকে নির্দেশ করবে।

সি ++ এ memcpyআপনিও ব্যবহার করতে পারেন যদি আপনার অ্যারে সদস্যরা পিওডি হন (এটি মূলত প্রকার যা আপনি সি তেও অপরিবর্তিত ব্যবহার করতে পারেন) তবে সাধারণভাবে এর অনুমতি দেওয়া memcpyহবে না । অন্যরা যেমন উল্লেখ করেছে, ব্যবহার করার কাজটি হচ্ছে std::copy

যা বলেছিলেন, সি ++ এ আপনার খুব কমই কাঁচা অ্যারে ব্যবহার করা উচিত। পরিবর্তে আপনি হয় স্ট্যান্ডার্ড পাত্রে একটি ব্যবহার করুন ( std::vectorএকটি অন্তর্নির্মিত অ্যারে সবচেয়ে কাছাকাছি, এবং আমি জাভা অ্যারে সবচেয়ে কাছাকাছি মনে করি - স্পষ্টত C ++ অ্যারের তুলনায়, তবে - std::dequeবা std::listকিছু ক্ষেত্রে আরও উপযুক্ত হতে পারে) বা, আপনি যদি সি ++ 11 ব্যবহার করেন std::arrayযা অন্তর্নির্মিত অ্যারেগুলির খুব কাছে, তবে অন্যান্য সি ++ প্রকারের মতো মান শব্দার্থক সহ। আমি এখানে উল্লিখিত সমস্ত ধরণের অ্যাসাইনমেন্ট বা অনুলিপি নির্মাণের মাধ্যমে অনুলিপি করা যেতে পারে। তদ্ব্যতীত, আপনি পুনরুক্তি সিনট্যাক্স ব্যবহার করে অপেন থেকে অন্য (এবং এমনকি বিল্ট-ইন অ্যারে থেকে) "ক্রস-অনুলিপি" করতে পারেন।

এটি সম্ভাবনার একটি ওভারভিউ দেয় (আমি ধরে নিই যে সমস্ত প্রাসঙ্গিক শিরোনাম অন্তর্ভুক্ত করা হয়েছে):

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
স্মৃতিচারণ উদাহরণ ভুল; উত্স এবং গন্তব্য পরিবর্তন করা হয়।
এটি - শিক্ষার্থী

4
প্রকৃতপক্ষে, memcpyউদাহরণটিতে কেবল এটিই ভুল ছিল না ; আকারটিও ভুল ছিল। আমি এখন এটি স্থির করেছি, আপনাকে ধন্যবাদ।
celtschk

আপনি শুধু স্টাডির নেমস্পেস ব্যবহার না করে সারাক্ষণ স্টাডি লিখছেন কেন ???
কালো

আপনি মেমকি করতে পারবেন না (খ, ক, মাপের একটি); খুব?
রদি

একটি জাভা অ্যারে পছন্দ মতো std:arrayবেশি std::vector, কারণ এটির একটি নির্দিষ্ট আকার রয়েছে।
বার্ট ভ্যান হিউকেলোম

17

আপনি ব্যবহার করতে পারেন 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। অনুলিপিটি এমনভাবে ঘটে যেন কোনও মধ্যবর্তী বাফার ব্যবহার করা হত, গন্তব্য এবং উত্সকে ওভারল্যাপ করার অনুমতি দেয়।


4
এখানে -1 করতে হবে। ওপি বিশেষত একটি সি ++ সমাধানের জন্য জিজ্ঞাসা করছে এবং এই উত্তরটি যে পরিস্থিতিতে memcpyভুল তা বোঝায় না, অর্থাৎ বাইটস অনুলিপি করা অপ্রতুল।
এড এস

4
@ এডএস। আপনি খেয়াল না করলে, ওপিতে এখন সি বা সি ++ সমাধানের জন্য জিজ্ঞাসা করা হচ্ছে ।
অটিস্টিক

4
আমি যখন উত্তর দিয়েছিলাম ওপি সি / সি ++ সমাধানের জন্য জিজ্ঞাসা করেছিল, যদিও আমি ব্যক্তিগতভাবে বিশ্বাস করি "সি / সি ++" উভয় ভাষারই অবমাননা। :)
দীপু

যথেষ্ট ন্যায্য, আমি বুঝতে পারিনি যে এটি পরিবর্তন হচ্ছে। সম্ভবত এটি এমনকি এটি আগেও বলেছিল এবং আমি এটি মিস করেছি। -1 সরানো হয়েছে।
এড এস

4
@ এডএস আমি ভেবেছিলাম এটি 2 মিনিট, তবে নির্বিশেষে, এই উত্তরটি পোস্ট করার সময়, প্রশ্নটি সি এবং সি ++ উভয়ই উল্লেখ করেছে। এমনকি যদি আমি ভুল হয়ে গিয়েছিলাম এবং এক পর্যায়ে প্রশ্নটি কেবলমাত্র সি ++ বলেছিল, ডাউনভোটটি ওয়ারেন্টেড ছিল না।
জিম বাল্টার

16

memcpyসি, std::copyসি ++ এ ব্যবহার করুন ।


একটি ছোট অ্যারের জন্য আমি ধরে নিই যে কোনও ফাংশন কল ওভারহেড জড়িত নয় ( memcpyএকটি সংকলক অভ্যন্তরীণ হওয়া উচিত)?
wcochran

@ মেহরদাদ আমি অন্যথায় বলিনি; শুধু একটি মন্তব্য করা। এবং আমি এটিকেও হ্রাস করিনি।
এমডি এক্সএফ

12

আমি এড এস এর উত্তর পছন্দ করি তবে এটি কেবল স্থির আকারের অ্যারেগুলির জন্যই কাজ করে না যখন অ্যারেগুলি পয়েন্টার হিসাবে সংজ্ঞায়িত করা হয়।

সুতরাং, সি ++ সমাধান যেখানে অ্যারেগুলি পয়েন্টার হিসাবে সংজ্ঞায়িত করা হয়েছে:

#include<algorithm>
...
const int bufferSize = 10;
char* origArray, newArray;
std::copy(origArray, origArray + bufferSize, newArray);

দ্রষ্টব্য : buffersize1 দিয়ে ছাড়ের দরকার নেই :

  1. প্রথম থেকে শুরু করে শেষের দিকে এগিয়ে যাওয়ার - [প্রথম, শেষ) সীমাতে সমস্ত উপাদান অনুলিপি করে

দেখুন: https://en.cppreferences.com/w/cpp/algorithm/copy


10

সি আপনি ব্যবহার করতে পারেন memcpy। সি ++ std::copy<algorithm>হেডার থেকে ব্যবহার করুন ।


3

সি ++ 11 এ আপনি 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;
}

std::endপারফরম্যান্সের কারণে লুপটি বাইরে নিয়ে যাওয়া আরও ভাল ধারণা হবে (সি 1 লুপের সময় পুনরাবৃত্তকারীগুলিকে পরিবর্তন বা অকার্যকর করে না, সুতরাং শেষটি পুনরায় গণনা করা অপ্রয়োজনীয়)।
celtschk

3

আমি এখানে সি এবং সি ++ ভাষার জন্য অ্যারে মোকাবিলার 2 টি উপায় দিই। মেমকি এবং কপি উভয় সি ++ এ ব্যবহারযোগ্য কিন্তু সি এর জন্য অনুলিপি ব্যবহারযোগ্য নয়, আপনি সিটিতে অ্যারে অনুলিপি করতে চাইলে আপনাকে মেমকি ব্যবহার করতে হবে you

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

4
using namespace std;একটি খারাপ অনুশীলন । কখনও এটি ব্যবহার করবেন না। সিপিপ্লসপ্লাস.কমের পরিবর্তে, দয়া করে cppreferences.com ব্যবহার করুন, যার মধ্যে স্ট্যান্ডার্ডটির অনেক ভাল এবং আপ-টু-ডেট ডকুমেন্টেশন অন্তর্ভুক্ত রয়েছে। stdio.hC ++ সমতূল্য cstdioপরিবর্তে ব্যবহার,। অতিরিক্তভাবে, কোডটি মোটামুটি অ-পরিচয়যুক্ত সি ++। আমি মনে করি আপনি যদি সি এবং সি ++ এর জন্য পৃথক সমাধান প্রদর্শন করেন তবে এটি আরও পরিষ্কার হবে।
tambre

3

আপনার কোডে কেবল স্ট্যান্ডার্ড লাইব্রেরি অন্তর্ভুক্ত করুন।

#include<algorithm>

অ্যারের আকার হিসাবে চিহ্নিত করা হবে n

আপনার পুরানো অ্যারে

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

নতুন অ্যারে ঘোষণা করুন যাতে আপনাকে আপনার পুরানো অ্যারের মানটি অনুলিপি করতে হবে

int newArray[n];

এটা ব্যবহার কর

copy_n(oldArray,n,newArray);

1

প্রথমত, আপনি সি ++ এ স্যুইচ করছেন বলে, traditional তিহ্যবাহী অ্যারের পরিবর্তে ভেক্টর ব্যবহার করার পরামর্শ দেওয়া হচ্ছে । এছাড়াও, একটি অ্যারে বা ভেক্টর অনুলিপি করতে,std::copy করা আপনার পক্ষে সেরা পছন্দ।

অনুলিপি ফাংশন কীভাবে ব্যবহার করতে হয় তার জন্য এই পৃষ্ঠাটি দেখুন: http://en.cppreferences.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());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.