যেহেতু std::list
এবং std::vector
অস্তিত্ব রয়েছে, তাই কি সি ++ তে প্রচলিত সি অ্যারে ব্যবহার করার কোনও কারণ আছে, বা তাদের মতো এড়ানো উচিত malloc
?
যেহেতু std::list
এবং std::vector
অস্তিত্ব রয়েছে, তাই কি সি ++ তে প্রচলিত সি অ্যারে ব্যবহার করার কোনও কারণ আছে, বা তাদের মতো এড়ানো উচিত malloc
?
উত্তর:
সি ++ ১১ এ যেখানে std::array
পাওয়া যায়, উত্তরটি "হ্যাঁ, অ্যারেগুলি এড়ানো উচিত"। সি ++ 11 এর আগে আপনাকে স্বয়ংক্রিয় স্টোরেজে অ্যারে বরাদ্দ করতে সি অ্যারে ব্যবহার করতে হবে (যেমন স্ট্যাকের উপরে)।
অবশ্যই, যদিও std::array
সি ++ 11 সহ, কার্যত কেবল স্থিতিশীল ডেটার জন্য। সি স্টাইল অ্যারেগুলির তিনটি গুরুত্বপূর্ণ সুবিধা রয়েছে
std::vector
:
তাদের গতিশীল বরাদ্দ প্রয়োজন হয় না। এই কারণে, সি স্টাইলের অ্যারেগুলি অগ্রাধিকার দেওয়া উচিত যেখানে আপনার খুব কম অ্যারে হওয়ার সম্ভাবনা রয়েছে। এন-ডাইমেনশন পয়েন্টের মতো কিছু বলুন:
template <typename T, int dims>
class Point
{
T myData[dims];
// ...
};
সাধারণত, কেউ কল্পনা করতে পারে যে dims
এটি খুব ছোট (2 বা 3),
T
একটি বিল্ট-ইন টাইপ ( double
) এবং আপনি std::vector<Point>
লক্ষ লক্ষ উপাদান দিয়ে শেষ করতে পারেন
। আপনি অবশ্যই তিন মিলিয়ন মিলিয়ন গতিশীল বরাদ্দ চান না।
সমর্থন স্থিতিশীল সূচনা। এটি কেবল স্থিতিশীল ডেটার জন্যই সমস্যা, যেখানে এরকম কিছু:
struct Data { int i; char const* s; };
Data const ourData[] =
{
{ 1, "one" },
{ 2, "two" },
// ...
};
এটি প্রায়শই কোনও ভেক্টর (এবং std::string
) ব্যবহার করা পছন্দনীয় , কারণ এটি সূচনা সংক্রান্ত সমস্ত ক্রমকে এড়িয়ে চলে ; কোনও আসল কোড কার্যকর করার আগে ডেটা প্রাক লোড হয় is
পরিশেষে, উপরের সাথে সম্পর্কিত, সংকলক আরম্ভকারীদের থেকে অ্যারের প্রকৃত আকার গণনা করতে পারে। আপনি তাদের গণনা করতে হবে না।
আপনার যদি সি ++ 11 এ অ্যাক্সেস থাকে std::array
তবে প্রথম দুটি সমস্যা সমাধান করে এবং প্রথম ক্ষেত্রে অবশ্যই সি স্টাইল অ্যারেগুলির পছন্দ হিসাবে ব্যবহার করা উচিত। এটি তৃতীয়টিকে সম্বোধন করে না, এবং প্রাথমিকের সংখ্যা অনুসারে সংকলক মাত্রা অ্যারে থাকা সি স্টাইল অ্যারেগুলিকে পছন্দ করার জন্য একটি বৈধ কারণ।
int i[] = { 1, 2, 3 };
সঙ্গে কাজ চালিয়ে যান int i[] = { 1, 2, 3, 4 };
। array<int, 3>
ম্যানুয়ালি পরিবর্তন করতে হবে array<int, 4>
।
make_array
ফাংশন ব্যবহার করে বরং মার্জিতভাবে সমাধান করা যেতে পারে । মার্টিনহো ফার্নান্দেস । make_pair
std::array
সি ++ 11 এর মধ্যে [তারা ব্যবহার করা উচিত] ব্যবহারিকভাবে কেবল স্ট্যাটিক ডেটার জন্য"।
কখনও "কখনই" বলবেন না, তবে আমি সম্মত হই যে এসটিএল থেকে সত্য ডেটা কাঠামো দ্বারা তাদের ভূমিকাটি হ্রাস পেয়েছে।
আমি আরও বলতে পারি যে বস্তুর অভ্যন্তরের এনক্যাপসুলেশনটি এই পছন্দগুলির প্রভাবকে হ্রাস করা উচিত। অ্যারেটি যদি কোনও ব্যক্তিগত ডেটা সদস্য হয় তবে আপনি নিজের শ্রেণীর ক্লায়েন্টকে প্রভাবিত না করেই এটিকে আউট বা আউট করতে পারেন।
আমি সুরক্ষা জটিল সিস্টেমে কাজ করেছি যেখানে আপনি গতিশীল মেমরি বরাদ্দ ব্যবহার করতে অক্ষম। স্মৃতিটি সর্বদা স্ট্যাকের মধ্যে থাকতে হবে। আকারটি সংকলনের সময় স্থির করা হওয়ায় এই ক্ষেত্রে আপনি অ্যারেগুলি ব্যবহার করবেন।
std::array<T>
স্ট্যাকগুলিতে বরাদ্দ দেয় এবং মূলত কাঁচা অ্যারেতে কোনও ওভারহেড থাকে না।
array
ইন c++
আপনাকে গতিশীল আকারের std::vector
এবং স্থির আকারের দ্রুত বিকল্প দেয় std::list
। std :: অ্যারে যোগ করার মধ্যে একটি c++11
। এটি সি-স্টাইল অ্যারেগুলির সামগ্রিক ধরণের শব্দার্থক সরবরাহ করার সময় এটি স্ট্যান্ড পাত্রে সুবিধা দেয় provides
সুতরাং c++11
আমি অবশ্যই std::array
ভেক্টর ব্যবহার করে যেখানে এটি প্রয়োজন হয়। তবে আমি সি স্টাইল অ্যারে এড়াতে চাই C++03
।
বেশিরভাগ ক্ষেত্রে, না , আমি কাঁচা অ্যারে ব্যবহার করার কোনও কারণ ভাবতে পারি না, বলুন vectors
। কোডটি নতুন হলে ।
আপনার লাইব্রেরিগুলিতে অ্যারে এবং কাঁচা পয়েন্টার প্রত্যাশার কোডের সাথে সামঞ্জস্য হওয়া দরকার হলে আপনাকে অ্যারে ব্যবহার করতে হবে।
vector.data()
সি ++ 11 বা তার &vector.front()
আগে
আমি জানি যে প্রচুর লোক স্ট্যাকের মধ্যে অ্যারে বরাদ্দ করার জন্য std :: অ্যারে, এবং স্তরের জন্য ভেক্টরকে নির্দেশ করছে। তবে উভয়ই অ দেশীয় সারিবদ্ধ সমর্থন করে বলে মনে হচ্ছে না। আপনি যদি এসএসই বা ভিপিএক্স নির্দেশাবলী ব্যবহার করতে চান এমন কোনও সংখ্যক কোড করছেন তবে (যথাক্রমে 128 বা 256 বাইট প্রান্তিককরণ প্রয়োজন), সি অ্যারেগুলি এখনও আপনার সেরা বাজি বলে মনে হচ্ছে be
আমি বলব অ্যারেগুলি এখনও দরকারী, যদি আপনি একটি অল্প স্থিতিশীল পরিমাণের ডেটা কেন সংরক্ষণ করেন না।
একটি অ্যারের কেবলমাত্র সুবিধা (অবশ্যই এমন কিছুতে আবৃত হবে যা প্রয়োজনের সাথে সাথে স্বয়ংক্রিয়ভাবে তার অবনতি পরিচালনা করবে) std::vector
এটি সম্পর্কে আমি ভাবতে পারি এটি হ'ল vector
এটির ডেটার মালিকানা পাস করতে পারে না, যদি না আপনার সংকলক সি ++ 11 সমর্থন করে এবং কনস্ট্রাক্টরকে সমর্থন করে।
swap
।
সি স্টাইল অ্যারেগুলি একটি মৌলিক ডেটা স্ট্রাকচার, তাই এটি ব্যবহার করা ভাল হলে কেসগুলি ঘটতে পারে। তবে সাধারণ ক্ষেত্রে, আরও উন্নত ডেটা স্ট্রাকচারগুলি ব্যবহার করুন যা অন্তর্নিহিত ডেটার কোণগুলির বাইরে থাকে। সি ++ আপনাকে মেমরির সাথে খুব আকর্ষণীয় এবং দরকারী কিছু করার অনুমতি দেয়, যার মধ্যে অনেকগুলি সহজ অ্যারে ব্যবহার করে।
std::array
এস এর চেয়ে বেশি মৌলিক ? উভয়ই অনেক ক্ষেত্রে একই সমাবেশে সংকলিত হবে।
std::array
স্ট্যাটিক অ্যারেগুলির উপরে নির্মিত অবিকল শব্দার্থবিজ্ঞান রয়েছে।
আপনার অভ্যন্তরীণভাবে এসটিএল কনটেইনার ব্যবহার করা উচিত, তবে আপনাকে বিভিন্ন মডিউলগুলির মধ্যে এমন পাত্রে পয়েন্টারগুলি পাঠানো উচিত নয়, বা আপনি নির্ভরতা নরকের মধ্যে এসে পৌঁছাবেন। উদাহরণ:
std::string foo;
// fill foo with stuff
myExternalOutputProc(foo.c_str());
একটি খুব ভাল সমাধান কিন্তু না
std::string foo;
// fill foo with stuff
myExternalOutputProc(&foo);
কারণটি হ'ল std :: স্ট্রিংটি বিভিন্নভাবে প্রয়োগ করা যেতে পারে তবে সি-স্টাইল স্ট্রিং সর্বদা একটি সি-স্টাইল স্ট্রিং থাকে।