আমি জানি যে ভ্যালারিতে কিছু সিনট্যাকটিক চিনি রয়েছে
আমার বলতে হবে যে std::valarrays
সিনথেটিক চিনির ক্ষেত্রে আমার খুব বেশি কিছু আছে বলে আমি মনে করি না । বাক্য গঠনটি ভিন্ন, তবে আমি এই পার্থক্যটিকে "চিনি" বলব না। এপিআই অদ্ভুত। বিভাগে std::valarray
মধ্যে গুলি সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ এই অস্বাভাবিক API ও সত্য যে, যেহেতু উল্লেখ std::valarray
গুলি অত্যন্ত অপ্টিমাইজ করা আশা করা যায়, কোনো ত্রুটি বার্তা আপনি তাদের ব্যবহার সম্ভবত অ স্বজ্ঞাত হতে হবে যখন পান।
কৌতূহলের বাইরে, প্রায় এক বছর আগে আমি এর std::valarray
বিরুদ্ধে দাঁড়ালাম std::vector
। আমার কাছে এখন আর কোড বা সুনির্দিষ্ট ফলাফল নেই (যদিও এটি আপনার নিজের লেখা শক্ত হওয়া উচিত নয়)। জিসিসি আমি ব্যবহার করেনি যখন ব্যবহার করে একটি সামান্য কর্মক্ষমতা বেনিফিট পেতে std::valarray
সহজ গাণিতিক জন্য, কিন্তু আমার বাস্তবায়নের স্ট্যানডার্ড ডেভিয়েশন গণনা করার জন্য (এবং, অবশ্যই, স্ট্যানডার্ড ডেভিয়েশন যে জটিল না, যতটা গণিত যায়)। আমি সন্দেহ করি যে বড় আইটেমের প্রতিটি আইটেমে std::vector
অপারেশনগুলি std::valarray
এস এর ক্রিয়াকলাপের চেয়ে ক্যাশে আরও ভাল হয় । ( দ্রষ্টব্য , ম্যাসিফিলের পরামর্শ অনুসরণ করে , আমি vector
এবং থেকে প্রায় অভিন্ন পারফরম্যান্স পেতে সক্ষম হয়েছি valarray
)।
শেষ পর্যন্ত, std::vector
মেমরি বরাদ্দ এবং অস্থায়ী অবজেক্ট তৈরির মতো জিনিসের দিকে গভীর মনোযোগ দেওয়ার সময় আমি ব্যবহার করার সিদ্ধান্ত নিয়েছিলাম ।
উভয় std::vector
এবং std::valarray
একটি সংকীর্ণ ব্লক তথ্য সংরক্ষণ করুন। যাইহোক, তারা বিভিন্ন নিদর্শন ব্যবহার করে সেই ডেটা অ্যাক্সেস করে এবং আরও গুরুত্বপূর্ণ, API এর জন্য API এর std::valarray
চেয়ে আলাদা অ্যাক্সেস নিদর্শনগুলিকে উত্সাহ দেয় std::vector
।
স্ট্যান্ডার্ড বিচ্যুতি উদাহরণের জন্য, একটি নির্দিষ্ট ধাপে আমাকে সংগ্রহের গড় এবং প্রতিটি উপাদানটির মান এবং গড়ের মধ্যে পার্থক্য খুঁজে পাওয়া দরকার।
এর জন্য std::valarray
, আমি এরকম কিছু করেছি:
std::valarray<double> original_values = ... // obviously I put something here
double mean = original_values.sum() / original_values.size();
std::valarray<double> temp(mean, original_values.size());
std::valarray<double> differences_from_mean = original_values - temp;
আমি std::slice
বা আরও চালাক হতে পারে std::gslice
। এখন পাঁচ বছর পেরিয়ে গেছে।
কারণ std::vector
, আমি এর লাইনে কিছু করেছি:
std::vector<double> original_values = ... // obviously, I put something here
double mean = std::accumulate(original_values.begin(), original_values.end(), 0.0) / original_values.size();
std::vector<double> differences_from_mean;
differences_from_mean.reserve(original_values.size());
std::transform(original_values.begin(), original_values.end(), std::back_inserter(differences_from_mean), std::bind1st(std::minus<double>(), mean));
আজ আমি অবশ্যই অন্যভাবে লিখতে হবে। আর কিছু না হলে আমি সি ++ 11 ল্যাম্বডাসের সুবিধা নেব।
এটা স্পষ্ট যে কোডের এই দুটি স্নিপেট বিভিন্ন জিনিস করে things উদাহরণস্বরূপ, std::vector
উদাহরণটি মধ্যবর্তী মধ্যবর্তী সংগ্রহ তৈরি করে std::valarray
না। যাইহোক, আমি কারণ পার্থক্য মধ্যে পার্থক্য বাঁধা সেগুলিকে তুলনা করতে এটা ন্যায্য মনে std::vector
এবং std::valarray
।
আমি যখন এই উত্তরটি লিখেছিলাম তখন আমার সন্দেহ হয়েছিল যে দুটি std::valarray
সের ( std::valarray
উদাহরণের শেষ লাইন ) থেকে উপাদানগুলির মান বিয়োগ করা উদাহরণের সাথে সম্পর্কিত লাইনটির চেয়ে কম ক্যাশে-বান্ধব std::vector
হবে (যা শেষ লাইনেও ঘটে)।
এটি দেখা যাচ্ছে, যে,
std::valarray<double> original_values = ... // obviously I put something here
double mean = original_values.sum() / original_values.size();
std::valarray<double> differences_from_mean = original_values - mean;
std::vector
উদাহরণ হিসাবে একই জিনিস , এবং প্রায় একই কর্মক্ষমতা আছে। শেষ পর্যন্ত, প্রশ্নটি হল আপনি কোন API পছন্দ করেন।