পূর্ণসংখ্যার একটি গতিশীল অ্যারে কীভাবে তৈরি করবেন


85

newকীওয়ার্ডটি ব্যবহার করে সি ++ তে পূর্ণসংখ্যার গতিশীল অ্যারে কীভাবে তৈরি করবেন ?


12
আপনি একটি ব্যবহার std::vector<int>। এবং একটি বই
GManNGG

এর ডেটা শুরু হওয়ার পরে আপনি কীভাবে নিয়োগ এবং অ্যাক্সেস করবেন?

এই পোস্টটি একবার দেখুন, এখানে এটি প্রতিটি ধরণের ডেটাটাইপগুলির জন্য বিশদভাবে দেওয়া হয়েছে: প্রোগ্রামিংটিউনস
ফিনামিক- অ্যারে- ইন- সি


quora.com/What-is-the-meaning-of-%E2%80%9Cint- * p-new-10-% E2% 80% 9D #: text: টেক্সট =% 20 স্টেটমেন্ট% 20%% 20% এবং 20% শিরোনাম, ।% 20an% 20array% 20of% 20integers & টেক্সট = এই% 20statement% 20will% 20dynamically% 20allocate ইন্টিজার% 20from% 20% 20heap ...
Nagappa

উত্তর:


129
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

deleteআপনার বরাদ্দ করা প্রতিটি অ্যারে ভুলবেন না new


28
আমি -1 করব না, তবে আপনি যদি এমনকি ভুলেও যেতে পারেন তবে deleteআপনার কোডটি ভুল।
GManNGG

4
8 বছর পরে সেই মন্তব্যটি @GManNickG কে বিভ্রান্ত করতে পারে, কীভাবে এটি মুছে ফেলা হবে (যেহেতু আমি মনে করি এটি জেসন আইভারসন আসলে অ্যারে মুছার আগে তৈরি হয়েছিল)?
gsamaras

4
@সাগারামস: আমি একমত যে এটি বিভ্রান্তিকর তবে এটি এখনও সঠিক: আপনার কোডটিতে ম্যানুয়াল মুছে ফেলা উচিত নয় যা আপনাকে ভুলে যাওয়ার কথা মনে রাখতে হবে না। এটি ব্যবহৃত স্মার্ট পয়েন্টার এবং অন্যান্য পাত্রে।
GManNickG

4
@GManNickG আমি মনে করি আপনার মন্তব্য কম জঘন্য হতে পারে। কোডটি সঠিক নয়, এমনকি এটি আদর্শ না হলেও। স্মার্ট পয়েন্টার এবং পাত্রে প্রায় সর্বদা একটি ভাল বিকল্প (বিশেষত এর মতো একটি প্রাথমিক প্রশ্নে) তবে সর্বদা "সর্বদা" নয়।
স্পেন্সার

আমি @ স্পেনসারের সাথে একমত, কোডটি ভুল নয়, এটি সহজ, নিখুঁত সি ++। আপনি কোনও বিকল্পটি আন্ডারলাইজ করতে পারেন, এটিকে সেরা অনুশীলনগুলি বলুন etc. তবে প্রতি উদাহরণস্বরূপ এ সম্পর্কে কোনও ভুল নেই।
আরমান

67

সি ++ ১১ যেহেতু, এর একটি নিরাপদ বিকল্প রয়েছে new[]এবং delete[]এটি শূন্য-ওভারহেডের মত নয় std::vector:

std::unique_ptr<int[]> array(new int[size]);

সি ++ 14 এ:

auto array = std::make_unique<int[]>(size);

উপরের উভয়ই একই শিরোলেখ ফাইলটিতে নির্ভর করে, #include <memory>


আমি জানি না এটি কেবল আমার কিনা তবে সি ++ 11 বাক্য গঠনটি godশ্বরকে ভয়ঙ্কর দেখায়। সি ++ 14 আরও ভাল দেখায়। তারপরে আবার আমি প্রি-সি ++ 11-এর পরে রাখিনি। এই সমস্ত নতুন এক্সপ্রেশন মনে রাখা কঠিন।
কেয়া কার্সটিং

31

আপনি স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরি ব্যবহার বিবেচনা করতে চাইতে পারেন। এটি সহজ এবং সহজেই ব্যবহারযোগ্য, এছাড়াও আপনাকে মেমরির বরাদ্দ সম্পর্কে চিন্তা করতে হবে না।

http://www.cplsplus.com/references/stl/vector/vector/

int size = 5;                    // declare the size of the vector
vector<int> myvector(size, 0);   // create a vector to hold "size" int's
                                 // all initialized to zero
myvector[0] = 1234;              // assign values like a c++ array

8
@ এড, প্রশ্নের সীমাবদ্ধতা বরং স্বেচ্ছাচারী বলে মনে হচ্ছে। std::vectorউপযুক্ত কনস্ট্রাক্টর সহ সত্যই ভাল কাজ করে এবং একটি বিকল্প হিসাবে চিহ্নিত করা উচিত। কখনও কখনও লোকেরা প্রশ্নটি খারাপভাবে জিজ্ঞাসা করে, এবং এটি এর মধ্যে অন্যতম একটি হিসাবে গণ্য হতে পারে - এটি খুব সংক্ষিপ্ত এবং পছন্দ করার পক্ষে কোনও যুক্তি দেয় না new
মার্ক রান্সম

4
@ এড: new[]পরিবর্তে ব্যবহার করার কোনও কারণ নেই std::vector
GManNickG

4
@ বাশ: সি ++ তে কোনও কারণ নেই। যদি আপনি সিদ্ধান্ত নেন তবে যে কোনও কারণেই হোক না কেন "স্ট্যান্ডার্ড লাইব্রেরিটি সরিয়ে ফেলতে", আপনি আর সি ++ তে প্রোগ্রামিং করছেন না। আমার মন্তব্যটি সি ++ ভাষার জন্য, সি ++ নয় - আমার-ডিভাইসে ভাষা-আমরা-ব্যবহার করব। তবুও, আপনাকে deleteকখনও ম্যানুয়ালি কোনও প্রয়োজন হবে না । এছাড়াও, std::vectorএকটি গতিশীল অ্যারে, এবং লিঙ্কযুক্ত তালিকার সাথে কিছুই করে না। এটি স্মৃতির এক অংশের চারপাশে কেবল একটি মোড়ক।
GManNGG

4
@ মন্টডিডিয়ার: না, আপনি এখনও ব্যবহার করেন newএবং মোড়ক deleteকার্যকর করতে পারেন । মুল বক্তব্যটি আপনি কোনও সংস্থান পরিচালনা করেন না এবং এটি ব্যবহার করেন না, আপনি একটি বা অন্যটি করেন।
GManNickG

4
@ মন্টডিডিয়ার: আসুন দাবিগুলি দিয়ে শুরু করুন: সি ++ তে সমস্ত দৃষ্টান্ত new[]প্রতিস্থাপন করা যেতে পারে std::vector। এবং যেহেতু std::vectorরিসোর্স ম্যানেজমেন্ট (এসবিআরএম) থেকে রিসোর্স ম্যানেজমেন্টকে সঠিকভাবে পৃথক করে, আমাদের এটি করা উচিত।
GManNickG

6
int* array = new int[size];

4
এটি কেবল প্রশ্নের উত্তর দেয়।
এড এস।

@GManNickG কারণ ভেক্টর আরও সুবিধাজনক হতে পারে বা অন্য কারণে? কারণ আমি প্রায়শই তৃতীয় পক্ষের ফাংশনগুলির মুখোমুখি হই যা ভেক্টরগুলির পরিবর্তে অ্যারে ব্যবহার প্রয়োজন।
লস ম্যাজেস্টে

4
@ লাসেমেজেস্টé ভেক্টর ব্যবহার না করার কোনও কারণ নেই - std::vector::data()যখন প্রয়োজন হবে তখন সদস্যের কাজটি অন্তর্নিহিত কাঁচা অ্যারে ফিরিয়ে দেবে।
Emlai

4
@ জেনিথ: সাধারণত, আপনি কোনও ভেক্টরের কাছ থেকে পয়েন্টার পাওয়ার operator&চেয়ে ব্যবহার করতেন data(), তবে এটি সত্য যে কোনও ভেক্টর অ্যারে প্রত্যাশিত ফাংশনগুলির সাথে সামঞ্জস্যের জন্য প্রয়োজনীয় সামঞ্জস্য গ্যারান্টি সরবরাহ করে।
বেন ভয়েগট

3

গতিশীল অ্যারে সম্পর্কে প্রশ্ন হওয়ার সাথে সাথে আপনি কেবল পরিবর্তনশীল আকারের সাথে অ্যারে তৈরি করতে না চান, রানটাইমের সময় এর আকার পরিবর্তন করতে চান। এখানে উদাহরণ সহ memcpy, আপনি ব্যবহার করতে পারেন memcpy_sবা std::copyপাশাপাশি করতে পারেন । সংকলক উপর নির্ভর করে, <memory.h>বা <string.h>প্রয়োজন হতে পারে। এই ফাংশনগুলি ব্যবহার করার সময় আপনি নতুন মেমরি অঞ্চল বরাদ্দ করেন, এটিতে মূল মেমরি অঞ্চলের মানগুলি অনুলিপি করুন এবং তারপরে সেগুলি ছেড়ে দিন।

//    create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];

//   now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];

/*   
somehow set values to given arrays
*/ 

//    add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;

আপনি এর পরিবর্তে ধ্রুব 4 ব্যবহার করতে পারেন sizeof(int)


1

গতিশীলভাবে কিছু মেমরি ব্যবহার করে বরাদ্দ করুন new:

int* array = new int[SIZE];

4
আপনি সম্ভবত কোলন অনুপস্থিত, বা সত্য আকারের সাথে SIZE প্রতিস্থাপন করেন নি ।
মন্টদিডিয়ার

4
কেন একটি আধা কোলন থাকতে হবে? এটি সম্পূর্ণ বিবৃতি নয়। আরও ঘোষণা হতে পারে। এটি, যদি কোনও সম্পূর্ণ প্রোগ্রামে অন্তর্ভুক্ত থাকে তবে ওপি যা বলেছিল তা করে।
বেঞ্জামিন লিন্ডলি

-1
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{

    float arr[2095879];
    long k,i;
    char ch[100];
    k=0;

    do{
        cin>>ch;
        arr[k]=atof(ch);
        k++;
     }while(ch[0]=='0');

    cout<<"Array output"<<endl;
    for(i=0;i<k;i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

উপরের কোডটি কাজ করে, সর্বাধিক ফ্লোট বা ইন্টি অ্যারের আকার যা সংজ্ঞায়িত করা যেতে পারে সেটি 2095879 আকারের ছিল এবং প্রস্থান শর্তটি শূন্য শুরুর ইনপুট নম্বর হবে


ডায়নামিক অ্যারে সম্পর্কে কোনও প্রশ্নের সাথে এর কোনও যোগসূত্র নেই।
বেন ভয়েগট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.