@ আইনপোকলম এখানে তার উত্তরেspan
যা আছে তা উপস্থাপনের জন্য বেশ ভাল কাজ করে । তবে, তার উত্তরটি পড়ার পরেও, নতুন কারওর পক্ষে এখনও স্ট্রিম-অফ-চিন্তার প্রশ্নগুলির ক্রম থাকা সহজ , যার পুরো উত্তর দেওয়া হয়নি, যেমন:
span
সি অ্যারে থেকে আলাদা কীভাবে ? কেন শুধু তাদের একটি ব্যবহার করবেন না? দেখে মনে হচ্ছে এটি পরিচিত আকারগুলির মধ্যে কেবল একটি ...
- অপেক্ষা করুন, এটি একটি মত শোনাচ্ছে
std::array
, এর span
থেকে আলাদা কীভাবে ?
- ওহ, এটি আমাকে মনে করিয়ে দেয়, খুব একটা
std::vector
ভালো std::array
লাগে না?
- আমি খুবই দ্বিধাগ্রস্ত. :( কি
span
?
সুতরাং, এখানে কিছু অতিরিক্ত স্পষ্টতা এখানে:
তাঁর উত্তরের প্রত্যক্ষ উক্তি - সাহসী আমার বিজ্ঞাপনগুলি সহ :
এটা কি?
এ span<T>
:
T
স্মৃতিতে কোথাও ধরণের মানগুলির সংলগ্ন ধারাটির খুব হালকা বিমূর্ততা ।
- মূলত একগুচ্ছ সুবিধা পদ্ধতি সহ একটি একক কাঠামো
{ T * ptr; std::size_t length; }
। (লক্ষ্য করুন এই থেকে সম্পূর্ণ ভিন্ন std::array<>
কারণে span
পদ্ধতি অ্যাকসেসর সুবিধা, এর তুলনীয় সম্ভব std::array
একটি মাধ্যমে টাইপ করতে পয়েন্টারT
এবং ধরনের দৈর্ঘ্য (উপাদানের সংখ্যা) T
, যেহেতু std::array
প্রকৃত ধারক যা এক বা একাধিক ঝুলিতে মান ধরনের T
।)
- একটি মালিকানাবিহীন প্রকার (যেমন "মানের ধরণের" পরিবর্তে " একটি " রেফারেন্স- ধরণের "): এটি কখনই কোনও কিছু বরাদ্দ দেয় না বা হ্রাস করে না এবং স্মার্ট পয়েন্টারগুলিকে বাঁচিয়ে রাখে না।
এটি পূর্বে একটি হিসাবে array_view
এবং এমনকি আগে হিসাবে পরিচিত ছিল array_ref
।
এই সাহসী অংশগুলি কারও বোঝার জন্য সমালোচনা , সুতরাং সেগুলি মিস করবেন না বা তাদের ভুল পড়বেন না! একজন span
structs এর একটি সি-অ্যারে নয়, না এটা ধরনের সি-অ্যারের একটি struct হয় T
প্লাস অ্যারের দৈর্ঘ্য (এই মূলত কি হবে std::array
ধারক হয়), না এটা পয়েন্টার structs এর একটি সি-অ্যারে T
দৈর্ঘ্য টাইপ করতে , বরং এটি টাইপ করার জন্য একটি একক পয়েন্টার সমেত একক কাঠামো , এবং দৈর্ঘ্য , যা সংক্ষিপ্ত মেমরি ব্লকের উপাদানগুলির (টাইপের ) সংখ্যা যা পয়েন্টারটি পয়েন্ট টাইপ করতে হয়! এইভাবে, আপনি ব্যবহার করে একমাত্র ওভারহেড যুক্ত করেছেনT
T
T
span
পয়েন্টার এবং দৈর্ঘ্য সংরক্ষণ করার জন্য ভেরিয়েবলগুলি এবং আপনি যে কোনও সুবিধাযুক্ত অ্যাক্সেসর ফাংশন ব্যবহার করেন যা span
সরবরাহ করে।
এটি অপরিবর্তিত একটি std::array<>
কারণ std::array<>
প্রকৃতপক্ষে পুরো সংক্ষিপ্ত ব্লকের জন্য মেমরি বরাদ্দ করে, এবং এটি অপছন্দ std::vector<>
কারণ কারণ std::vector
এটি মূলত কেবল একটি std::array
যা গতিশীল বর্ধন (সাধারণত আকারে দ্বিগুণ) করে প্রতিবার এটি পূর্ণ হয় এবং আপনি এটিতে অন্য কিছু যুক্ত করার চেষ্টা করেন । এ std::array
আকারে স্থির থাকে, এবং এটি একটি span
ব্লকের স্মৃতি পরিচালনাও করে না যা এটি নির্দেশ করে, এটি কেবল মেমরির ব্লকের দিকে নির্দেশ করে, মেমরির ব্লকটি কত দীর্ঘ তা জানে, সি-অ্যারেতে ডেটা টাইপ কী তা জানে মেমরিতে, এবং সেই সংমিশ্রিত মেমরির উপাদানগুলির সাথে কাজ করতে সুবিধাজনক অ্যাক্সেসর ফাংশন সরবরাহ করে ।
এটা তোলে হয় সি অংশ ++ স্ট্যান্ডার্ডের:
std::span
সি ++ 20 হিসাবে সি ++ স্ট্যান্ডার্ডের অংশ। আপনি এখানে তার ডকুমেন্টেশন পড়তে পারেন: https://en.cppreferences.com/w/cpp/container/span । absl::Span<T>(array, length)
সি ++ 11 বা তার পরে আজ গুগল কীভাবে ব্যবহার করবেন তা দেখতে নীচে দেখুন।
সংক্ষিপ্ত বিবরণ এবং মূল তথ্যসমূহ:
std::span<T, Extent>
( Extent
= "ক্রমানুসারে উপাদানের নম্বর, বা std::dynamic_extent
গতিশীল যদি" কোনও স্প্যান মাত্র। পয়েন্ট মেমরি এবং অ্যাক্সেস করতে এটি সহজ করে তোলে, কিন্তু এটা পরিচালনা করে না!):
- https://en.cppreference.com/w/cpp/container/span
std::array<T, N>
(লক্ষ্য করুন এটির একটি নির্দিষ্ট আকার রয়েছে N
!):
- https://en.cppreference.com/w/cpp/container/array
- http://www.cplusplus.com/reference/array/array/
std::vector<T>
(প্রয়োজনীয় হিসাবে স্বয়ংক্রিয়ভাবে আকারে আকারে বৃদ্ধি পায়):
- https://en.cppreference.com/w/cpp/container/vector
- http://www.cplusplus.com/reference/vector/vector/
আমি আজspan
সি ++ 11 বা তার পরে কীভাবে ব্যবহার করতে পারি ?
গুগল তাদের "Abseil" লাইব্রেরি আকারে তাদের অভ্যন্তরীণ সি ++ 11 গ্রন্থাগার খোলা সন্ধান করেছে। এই লাইব্রেরিটি সি ++ 14 থেকে সি ++ 20 এবং সি ++ 11 এবং তার পরে কাজ করে এমন বৈশিষ্ট্যগুলি ছাড়িয়ে সরবরাহ করার উদ্দেশ্যে যাতে আপনি আজকের কালকের বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন। তারা বলে:
সি ++ স্ট্যান্ডার্ডের সাথে সামঞ্জস্যতা
গুগল অনেকগুলি বিমূর্ততা তৈরি করেছে যা সি ++ 14, সি ++ 17 এবং এর বাইরে সংযুক্ত বৈশিষ্ট্যগুলির সাথে মেলে বা ঘনিষ্ঠভাবে মেলে। এই বিমূর্ততার Abseil সংস্করণগুলি ব্যবহার করা আপনাকে এখনই এই বৈশিষ্ট্যগুলিতে অ্যাক্সেস করতে দেয়, এমনকি যদি আপনার কোডটি সি ++ 11 পোস্টের পোস্টে জীবনের জন্য প্রস্তুত না হয়।
এখানে কয়েকটি মূল সংস্থান এবং লিঙ্ক রয়েছে:
- মূল সাইট: https://abseil.io/
- https://abseil.io/docs/cpp/
- গিটহাব সংগ্রহস্থল: https://github.com/abseil/abseil-cpp
span.h
শিরোনাম এবং absl::Span<T>(array, length)
টেম্পলেট শ্রেণি: https://github.com/abseil/abseil-cpp/blob/master/absl/tyype/span.h#L189
std::span
এটি 2017 সালে প্রস্তাবিত হয়েছিল It এটি C ++ 17 বা C ++ 20 এর ক্ষেত্রে প্রযোজ্য। এছাড়াও P0122R5 দেখুন, স্প্যান: অবজেক্টের সিকোয়েন্সের জন্য সীমানা-সুরক্ষিত দর্শনগুলি । আপনি কি সত্যিই সেই ভাষাটিকে লক্ষ্য করতে চান? কম্পাইলাররা ধরার কয়েক বছর আগে এটি ঘটবে।