উচ্চতর অর্ডার তালিকার ফাংশনগুলির জন্য সি ++ 11 সমর্থন support


13

সর্বাধিক কার্মিক প্রোগ্রামিং ভাষা (যেমন প্রচলিত পাতার মর্মর, স্কিম / কোলাহল, Clojure, Haskell,, Scala, Ocaml, SML) যেমন তালিকার কিছু সাধারণ উচ্চতর-অর্ডার ফাংশন, সমর্থন map, filter, takeWhile, dropWhile, foldl, foldr(দেখুন উদাঃ , প্রচলিত পাতার মর্মর, স্কিম / কোলাহল ক্লোজারের পাশাপাশি- ওপরে রেফারেন্স শীট , হাস্কেল , স্কালা , ওক্যামেল এবং এসএমএল ডকুমেন্টেশন)

সি ++ 11 এর কি সমমানের মান পদ্ধতি বা তালিকায় ফাংশন রয়েছে? উদাহরণস্বরূপ, নিম্নলিখিত হাস্কেল স্নিপেট বিবেচনা করুন:

let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs

আমি কীভাবে আধুনিক মানের সি ++ তে দ্বিতীয় প্রকাশটি প্রকাশ করতে পারি?

std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?

উপরে উল্লিখিত অন্যান্য উচ্চ-অর্ডার ফাংশনগুলি সম্পর্কে কী?
এগুলি কি সরাসরি সি ++ তে প্রকাশ করা যেতে পারে?


হ্যাঁ, তবে তারা দ্বিগুণ সংযুক্ত তালিকার নির্দিষ্ট প্রয়োগের চেয়ে আরও সাধারণ ধারণাগুলিতে কাজ করে। যেমনটি এই অঞ্চলে পাইথনের কার্যক্রম। আমি এটি একটি নির্দিষ্ট ডেটা কাঠামোর সাথে যুক্ত হওয়ার চেয়ে পছন্দ করি। এই অপারেশনগুলি কি কখনও Data.Sequenceহাস্কেলের মধ্যে বলার চেষ্টা করেছেন ? এটি তুলনামূলকভাবে কুরুচিপূর্ণ।

"এটি তুলনামূলকভাবে কুৎসিত।": কিসের তুলনায়?
জর্জিও

একই অপারেশন তুলনায় [a]। আপনাকে হয় প্রিলিড ফাংশনটি গোপন করতে হবে, উপস্থাপকের চারপাশে হ্যাক করতে হবে বা একটি আলাদা এবং কম স্বজ্ঞাত নাম চয়ন করতে হবে।

হতে পারে আপনি ঠিক বলেছেন, তবে এই প্রশ্নের মূল বিষয় হল সি ++ এ সাধারণ তালিকা উচ্চতর-ক্রিয়াকলাপগুলি কীভাবে প্রকাশ করা যায়, কীভাবে ডেভেলপমেন্টে সাদৃশ্য করা যায় না।হ্যাসকেলে সিকোয়েন্স e
জর্জিও

1
@ ডেলানান আমি যুক্তি দেব যে হাস্কেল তার পদ্ধতির চেয়ে অনেক বেশি সাধারণFunctor, Foldableএবং Traversableএটি বিমূর্তভাবে এমনভাবে অর্জন করুন যাতে আমি ভাবতে পারি। Data.Sequenceএই সমস্তগুলির একটি উদাহরণ, যাতে আপনি ঠিক করতে পারেন fmap (\x -> x * x) xsmapহয় fmapনতুনদের জন্য বিশেষ।
অ্যালেক

উত্তর:


16

আরও বেশি, সি ++ এর এই ধরনের ফাংশন রয়েছে, অ্যালগরিদম (বা সি ++ 11 সংযোজন সহ ) শিরোনামটি একবার দেখুন:

std::transform
std::for_each
std::remove_copy_if

এগুলি যে কোনও পাত্রে সহজেই ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ আপনার কোডটি এভাবে প্রকাশ করা যেতে পারে (সহজ কোডিংয়ের জন্য সি ++ 11 ল্যাম্বডাস সহ):

std::vector<int> x = {1, 2, 3, 4, 5};
std::vector<int> y;
std::transform(x.begin(), x.end(), std::back_inserter(y), [](int elem){ return elem * elem; });

স্বল্পজ্ঞানহীন, তবে আপনি std::transformকলটি সহজেই ফাংশনটিতে গুটিয়ে রাখতে পারবেন যা নতুন moveধারকটি ফেরত দেবে (আরও ভাল পারফিউমেন্সের জন্য শব্দার্থক সহ )।


ধন্যবাদ। আমি কিছু দিন আগে লিখেছি এমন কিছু কোড সহজ করতে চাই এবং এটি এটি আরও সংক্ষিপ্ত করে তুলতে সত্যই সহায়তা করতে পারে। একটি ছোট্ট প্রশ্ন: আপনার x.begin () এবং x.end () পাস করার দরকার কেন? শুধু ভেক্টর এক্স পাস করার জন্য যথেষ্ট হবে না?
জর্জিও

std::transformদুটি পুনরাবৃত্তকারী লাগে, সুতরাং, আপনি একটি ধারকটির টুকরো নিতে পারেন (মনে রাখবেন যে আপনার কাছে পুনরাবৃত্তগণিতগণিত আছে)।
এম0 নাহক

সুতরাং আপনার একটিতে দুটি অপারেশন রয়েছে: একটি স্লাইস নেওয়া, এবং একটি রূপান্তর প্রয়োগ করা।
জর্জিও

পূর্বে আপনার কাছে দুটি পুনরাবৃত্তিকারী রয়েছে এবং তাদের মধ্যে উপাদানগুলিতে রূপান্তর প্রয়োগ করছেন। আইট্রেটারগুলি কার্যকরী প্রোগ্রামিংয়ে সাধারণ নয়।
এম0 নাহক

2
আমি এই জাতীয় লাইব্রেরির সাথে দেখা করতে পারি নি, পুনরুদ্ধার-ভিত্তিক অ্যালগরিদম সি ++ তে অনেক দরকারী। আপনার ক্ষেত্রে, std::transformযেমন: এর একটি মোড়ক তৈরি করতে পারেন Y<U> map(T<U>, std::function<Y(U)>)
এম0 নাহক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.