আমি অনুভব করেছি যে এখানে উত্তরগুলির মধ্যে কোনওটিই ব্যাখ্যা করে না যে আমি কেন কনটেইনারগুলিতে সূচকের চেয়ে সাধারণ ধারণা হিসাবে পুনরাবৃত্তিকে পছন্দ করি। দ্রষ্টব্য যে আমার বেশিরভাগ পুনরাবৃত্তকারী ব্যবহার করার অভিজ্ঞতা আসলে সি ++ থেকে আসে না তবে পাইথনের মতো উচ্চ-স্তরের প্রোগ্রামিং ভাষা থেকে আসে।
পুনরুদ্ধারকারী ইন্টারফেসটি আপনার ফাংশনের গ্রাহকদের জন্য কম প্রয়োজনীয়তা আরোপ করে, যা গ্রাহকরা এটির সাথে আরও বেশি কিছু করতে দেয়।
তাহলে আপনার প্রয়োজন ফরোয়ার্ড বলছি পাবে থাকে, তাহলে বিকাশকারী সূচিযোগ্য পাত্রে ব্যবহার সীমাবদ্ধ নয় - তারা কোন শ্রেণীর বাস্তবায়নে ব্যবহার করতে পারেন operator++(T&)
, operator*(T)
এবং operator!=(const &T, const &T)
।
#include <iostream>
template <class InputIterator>
void printAll(InputIterator& begin, InputIterator& end)
{
for (auto current = begin; current != end; ++current) {
std::cout << *current << "\n";
}
}
// elsewhere...
printAll(myVector.begin(), myVector.end());
আপনার অ্যালগরিদম আপনার প্রয়োজনের ক্ষেত্রে কাজ করে - কোনও ভেক্টরের মাধ্যমে পুনরাবৃত্তি করে - তবে এটি আপনি যে অ্যাপ্লিকেশনগুলি প্রত্যাশা করেন না সেগুলির জন্যও এটি কার্যকর হতে পারে:
#include <random>
class RandomIterator
{
private:
std::mt19937 random;
std::uint_fast32_t current;
std::uint_fast32_t floor;
std::uint_fast32_t ceil;
public:
RandomIterator(
std::uint_fast32_t floor = 0,
std::uint_fast32_t ceil = UINT_FAST32_MAX,
std::uint_fast32_t seed = std::mt19937::default_seed
) :
floor(floor),
ceil(ceil)
{
random.seed(seed);
++(*this);
}
RandomIterator& operator++()
{
current = floor + (random() % (ceil - floor));
}
std::uint_fast32_t operator*() const
{
return current;
}
bool operator!=(const RandomIterator &that) const
{
return current != that.current;
}
};
int main()
{
// roll a 1d6 until we get a 6 and print the results
RandomIterator firstRandom(1, 7, std::random_device()());
RandomIterator secondRandom(6, 7);
printAll(firstRandom, secondRandom);
return 0;
}
বর্গক্ষেত্র-বন্ধনী অপারেটরটি প্রয়োগ করার চেষ্টা করা যা এই পুনরুক্তির অনুরূপ কিছু করে তা সংশ্লেষিত হবে, তবে পুনরুক্তি বাস্তবায়ন তুলনামূলক সহজ। স্কয়ার-বন্ধনী অপারেটরটি আপনার শ্রেণীর দক্ষতা সম্পর্কেও প্রভাব ফেলবে - আপনি যে কোনও স্বেচ্ছাচারিত বিন্দুতে সূচি আনতে পারেন - যা বাস্তবায়ন করা কঠিন বা অদক্ষ হতে পারে।
ইট্রেটাররাও নিজেকে সাজসজ্জাতে ndণ দেয় । লোকেরা পুনরুক্তি লিখতে পারে যা তাদের নির্মাত্রে একটি পুনরুক্তি করে এবং এর কার্যকারিতা প্রসারিত করে:
template<class InputIterator, typename T>
class FilterIterator
{
private:
InputIterator internalIterator;
public:
FilterIterator(const InputIterator &iterator):
internalIterator(iterator)
{
}
virtual bool condition(T) = 0;
FilterIterator<InputIterator, T>& operator++()
{
do {
++(internalIterator);
} while (!condition(*internalIterator));
return *this;
}
T operator*()
{
// Needed for the first result
if (!condition(*internalIterator))
++(*this);
return *internalIterator;
}
virtual bool operator!=(const FilterIterator& that) const
{
return internalIterator != that.internalIterator;
}
};
template <class InputIterator>
class EvenIterator : public FilterIterator<InputIterator, std::uint_fast32_t>
{
public:
EvenIterator(const InputIterator &internalIterator) :
FilterIterator<InputIterator, std::uint_fast32_t>(internalIterator)
{
}
bool condition(std::uint_fast32_t n)
{
return !(n % 2);
}
};
int main()
{
// Rolls a d20 until a 20 is rolled and discards odd rolls
EvenIterator<RandomIterator> firstRandom(RandomIterator(1, 21, std::random_device()()));
EvenIterator<RandomIterator> secondRandom(RandomIterator(20, 21));
printAll(firstRandom, secondRandom);
return 0;
}
এই খেলনাগুলি জাগতিক মনে হতে পারে, তবে সাধারণ ইন্টারফেসের সাহায্যে শক্তিশালী জিনিসগুলি পুনরাবৃত্তকারী এবং পুনরাবৃত্তকারী সাজসজ্জার ব্যবহার করে তা কল্পনা করা কঠিন নয় - উদাহরণস্বরূপ, একক ফলাফল থেকে একটি মডেল অবজেক্ট তৈরি করে এমন একটি পুনরাবৃত্তির সাথে ডাটাবেসের ফলাফলের কেবলমাত্র এক ফরোয়ার্ড সজ্জা করা যায় । এই নিদর্শনগুলি অসীম সেটগুলির মেমরি-দক্ষ পুনরাবৃত্তিকে সক্ষম করে এবং ফলাফলের সম্ভাব্য অলস মূল্যায়নের উপরে আমি যেমন লিখেছি তার মতো একটি ফিল্টার দিয়ে।
সি ++ টেম্পলেটগুলির শক্তির অংশ হ'ল আপনার পুনরাবৃত্ত ইন্টারফেস, যখন নির্দিষ্ট-দৈর্ঘ্যের সি অ্যারেগুলির পছন্দগুলি প্রয়োগ করা হয়, সহজ এবং দক্ষ পয়েন্টার গাণিতিকের সিদ্ধান্ত হয় , এটি সত্যিকারের শূন্য-ব্যতিক্রমী বিমূর্ততা তৈরি করে।
some_iterator++
করুন++some_iterator
। পোস্ট-ইনক্রিমেন্ট একটি অপ্রয়োজনীয় অস্থায়ী পুনরুক্তি তৈরি করে।