সি ++ ইটারেটর, কেন কোনও আইট্রেটর বেস ক্লাস নেই যাঁরা সব পুনরাবৃত্তির উত্তরাধিকার সূত্রে প্রাপ্ত


11

আমি একটি পরীক্ষার জন্য শিখছি এবং আমার একটি প্রশ্ন রয়েছে যার উত্তর দিতে এবং উত্তর দেওয়ার জন্য আমি লড়াই করছি।

অন্য কোনও পুনরাবৃত্তির উত্তরাধিকার সূত্রে কেন কোনও পুনরাবৃত্ত বেস শ্রেণীর অস্তিত্ব নেই?

আমার অনুমান যে আমার শিক্ষক সিপিপি রেফারেন্স " http://prnscr.com/mgj542 " থেকে শ্রেণিবদ্ধ কাঠামোকে উল্লেখ করছেন এবং তাদের কেন করা উচিত তা ছাড়া আমাদের অন্য কোনও কারণ সরবরাহ করতে হবে?

আমি জানি যে পুনরাবৃত্তকারীগুলি (সাজানোর) কী এবং সেগুলি পাত্রে কাজ করার জন্য ব্যবহৃত হয়। বিভিন্ন সম্ভাব্য অন্তর্নিহিত ডেটাস্ট্রাকচারের কারণে আমি যা বুঝি সেগুলি থেকে বিভিন্ন পাত্রে আলাদা আলাদা পুনরুক্তি থাকে কারণ আপনি এলোমেলোভাবে একটি অ্যারে অ্যাক্সেস করতে পারেন, উদাহরণস্বরূপ, তবে কোনও লিঙ্কযুক্ত তালিকা নয় এবং বিভিন্ন ধারকগুলির মাধ্যমে তাদের চলার বিভিন্ন উপায় প্রয়োজন require

তারা সম্ভবত ধারক উপর নির্ভর করে বিশেষায়িত টেম্পলেট হয়, তাই না?


2
আপনার গবেষণা ভাগ করে নেওয়া প্রত্যেককে সহায়তা করে । আপনি কী চেষ্টা করেছেন এবং কেন এটি আপনার প্রয়োজনীয়তা মেটেনি তা আমাদের বলুন। এটি প্রমাণ করে যে আপনি নিজেকে সাহায্য করার চেষ্টা করার জন্য সময় নিয়েছেন, এটি আমাদের সুস্পষ্ট উত্তরের পুনরাবৃত্তি থেকে বাঁচায় এবং সর্বোপরি এটি আপনাকে আরও নির্দিষ্ট এবং প্রাসঙ্গিক উত্তর পেতে সহায়তা করে। আরো দেখুন কিভাবে জিজ্ঞাসা করতে
মশা

5
" অন্য কোনও পুনরাবৃত্তির উত্তরাধিকার সূত্রে কেন কোনও পুনরাবৃত্ত বেসের শ্রেণি বিদ্যমান নেই? " উম ... কেন সেখানে একটি হওয়া উচিত ?
নিকল বোলাস

উত্তর:


14

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

যদি পুনরাবৃত্তিকারীরা তাদের সকলের দ্বারা একটি সাধারণ বেস শ্রেণি থেকে উত্তরাধিকার সূত্রে কাজ করে এবং ইন্টারফেসটি সংজ্ঞায়িত করতে বেস শ্রেণিতে ভার্চুয়াল ফাংশন ব্যবহার করে এবং উদ্ভূত শ্রেণীরা এই ভার্চুয়াল ফাংশনগুলির বাস্তবায়ন সরবরাহ করে, যা (এবং প্রায়শই) যথেষ্ট রান-টাইম যুক্ত করতে পারে জড়িত অপারেশন ওভারহেড।

আসুন বিবেচনা করা যাক, উদাহরণস্বরূপ, একটি সাধারণ পুনরাবৃত্তি শ্রেণিবিন্যাস যা উত্তরাধিকার এবং ভার্চুয়াল ফাংশন ব্যবহার করে:

template <class T>
class iterator_base { 
public:
    virtual T &operator*() = 0;
    virtual iterator_base &operator++() = 0;
    virtual bool operator==(iterator_base const &other) { return pos == other.pos; }
    virtual bool operator!=(iterator_base const &other) { return pos != other.pos; }
    iterator_base(T *pos) : pos(pos) {}
protected:
    T *pos;
};

template <class T>
class array_iterator : public iterator_base<T> {
public: 
    virtual T &operator*() override { return *pos; }
    virtual array_iterator &operator++() override { ++pos; return *this; }
    array_iterator(T *pos) : iterator_base(pos) {}
};

তাহলে আসুন এটির একটি দ্রুত পরীক্ষা দিন:

int main() { 
    char input[] = "asdfasdfasdfasdfasdfasdfasdfadsfasdqwerqwerqwerqrwertytyuiyuoiiuoThis is a stringy to search for something";
    using namespace std::chrono;

    auto start1 = high_resolution_clock::now();
    auto pos = std::find(std::begin(input), std::end(input), 'g');
    auto stop1 = high_resolution_clock::now();

    std::cout << *++pos << "\n";

    auto start2 = high_resolution_clock::now();
    auto pos2 = std::find(array_iterator(input), array_iterator(input+sizeof(input)), 'g');
    auto stop2 = high_resolution_clock::now();

    std::cout << *++pos2 << "\n";

    std::cout << "time1: " << duration_cast<nanoseconds>(stop1 - start1).count() << "ns\n";
    std::cout << "time2: " << duration_cast<nanoseconds>(stop2 - start2).count() << "ns\n";
}

[দ্রষ্টব্য: আপনার সংকলকটির উপর নির্ভর করে, সংকলকটির পুনরাবৃত্তিকে গ্রহণ করার জন্য আপনাকে আরও কিছু করার প্রয়োজন হতে পারে যেমন পুনরাবৃত্তিকার_ বিভাগের সংজ্ঞা, পার্থক্য_প্রকার, রেফারেন্স এবং আরও অনেক কিছু।]

এবং আউটপুটটি হ'ল:

y
y
time1: 1833ns
time2: 2933ns

[অবশ্যই, আপনি যদি কোডটি চালনা করেন তবে আপনার ফলাফলগুলি এর সাথে ঠিক মেলে না]]

সুতরাং, এমনকি এই সাধারণ ক্ষেত্রে (এবং প্রায় 80 বৃদ্ধি এবং তুলনা করা) আমরা একটি সাধারণ রৈখিক অনুসন্ধানে প্রায় 60% ওভারহেড যুক্ত করেছি। বিশেষত যখন পুনরাবৃত্তিকারীদের মূলত সি ++ এ যুক্ত করা হত, তখন খুব কম লোক কেবল এত বেশি ওভারহেড সহ কোনও নকশা গ্রহণ করতে পারত না। তারা সম্ভবত মানসম্মত হত না, এবং এমনকি যদি তারা ছিল, কার্যত কেউ তাদের ব্যবহার করবে না।


7

কিছু কী এবং কীভাবে কিছু আচরণ করে তার মধ্যে পার্থক্য ।

প্রচুর ভাষাগুলি দুটিকে একসাথে কাটানোর চেষ্টা করে তবে তারা বেশ স্বতন্ত্র বিষয়।

যদি কী হয়, এবং কীভাবে ...

যদি সমস্ত কিছু উত্তরাধিকার সূত্রে প্রাপ্ত হয় objectতবে কিছু সুবিধা পাওয়া যায় যেমন: কোনও বস্তুর ভেরিয়েবল যে কোনও মান ধরে রাখতে পারে। তবে এটি ঘষাও, সমস্ত কিছু অবশ্যই ( যেমন) একটির মতো আচরণ করবেobject এবং একটি ( কী ) এর মতো দেখতে হবে object

কিন্তু:

  • যদি আপনার অবজেক্টের সাম্যের কোনও অর্থপূর্ণ সংজ্ঞা না থাকে?
  • এর অর্থপূর্ণ হ্যাশ না থাকলে কী হবে?
  • যদি আপনার অবজেক্টটি ক্লোন করা না যায় তবে অবজেক্টগুলি কী হতে পারে?

হয় objectপ্রকারটি মূলত অকেজো হয়ে যায় - সমস্ত সম্ভাব্য দৃষ্টান্তগুলিতে কোনও জিনিস সরবরাহ না করার কারণে। অথবা এমন কিছু বস্তুর অস্তিত্ব থাকবে objectযার কয়েকটি ভাঙা / জুতোযুক্ত শিংযুক্ত / অযৌক্তিক সংজ্ঞা রয়েছে যা পাওয়া গেছে এমন কিছু গণ্যমান্য সম্পত্তির সংজ্ঞা পাওয়া গেছে যার উপর বেশ কয়েকটি গোটাচা বাদে প্রায় সর্বজনীন আচরণ প্রমাণিত হয় ।

যদি কীভাবে আবদ্ধ না হয়

পর্যায়ক্রমে আপনি কী এবং কীভাবে পৃথক রাখতে পারেন । তারপর বিভিন্ন প্রকার (এ সাধারণ কিছুই আছে এমন সমস্ত কি ) CAN একই ভাবে সব আচরণ সহযোগী থেকে দেখা যায় কিভাবে । এই অর্থে একটি এর ধারণাটি Iteratorএকটি নির্দিষ্ট কী নয় , তবে কীভাবে হয় । বিশেষ করে কিভাবে একটা জিনিস সাথে আপনি ইন্টারঅ্যাক্ট না যখন আপনি এখনো জানি না কি আপনার সাথে আলাপচারিতার হয়।

জাভা (এবং অনুরূপ) ইন্টারফেস ব্যবহার করে এগুলির কাছে যাওয়ার অনুমতি দেয়। এই ক্ষেত্রে একটি ইন্টারফেস যোগাযোগের মাধ্যমগুলি বর্ণনা করে এবং স্পষ্টতই যোগাযোগ ও ক্রিয়াকলাপের অনুসরণ করে যা অনুসরণ করা হয়। কোন কি যা নিজেই ঘোষণা একটি প্রদত্ত হতে কিভাবে , রাজ্য যে এটি যোগাযোগ এবং কর্ম প্রোটোকল দ্বারা রূপরেখা সমর্থন করে। এটি কোনও সহযোগী কী কী ব্যবহার করা যেতে পারে তা নির্দিষ্ট করে কীভাবে এবং কীভাবে জড়িয়ে পড়ছেন তার উপর নির্ভর করতে দেয় allows

সি ++ (এবং অনুরূপ) এর কাছে হাঁসের টাইপিংয়ের মাধ্যমে পদ্ধতির অনুমতি দেয়। কোনও সহযোগিতা প্রকার ঘোষণা করে যে এটি কোনও আচরণ অনুসরণ করে, কোনও নির্দিষ্ট সংকলন প্রসঙ্গে, কোনও নির্দিষ্ট উপায়ে বস্তুটির সাথে ইন্টারঅ্যাক্ট করা যায় কিনা তা কোনও টেমপ্লেটের যত্ন নেই। এটি সি ++ পয়েন্টারগুলি এবং অবজেক্টগুলিকে ওভার-রাইডিং নির্দিষ্ট অপারেটরগুলিকে একই কোড দ্বারা ব্যবহার করতে দেয়। কারণ তারা চেক-লিস্টের সমতুল্য বলে বিবেচিত হয়।

  • * a, a->, ++ a, এবং একটি ++ -> ইনপুট / ফরোয়ার্ড ইেটরেটর সমর্থন করে
  • * a, a->, ++ a, a ++, --a, এবং a-- -> দ্বিদ্বায়ক পুনরুক্তি সমর্থন করে

অন্তর্নিহিত টাইপ এমনকি iterating একটি ধারক হতে পারে, এটা কোনো কিছু হতে পারে নেই কি । অতিরিক্তভাবে এটি কিছু সহযোগীদের আরও জেনেরিক হতে দেয়, কোনও ফাংশনটির কেবলমাত্র প্রয়োজনীয় প্রয়োজনের কল্পনা a++করতে পারে, একটি পুনরাবৃত্তিকারী এটি পূরণ করতে পারে, সুতরাং কোনও পয়েন্টারও করতে পারে, সুতরাং কোনও সংখ্যক বাস্তবায়ন করতে পারে operator++

অধীনে এবং ওভার স্পেসিফিকেশন

উভয় পদ্ধতির সাথে সমস্যা নির্দিষ্টকরণের অধীনে এবং অতিরিক্ত।

একটি ইন্টারফেস ব্যবহার করার জন্য অবজেক্টটিকে এটি প্রদত্ত আচরণকে সমর্থন করে বলে ঘোষণার প্রয়োজন হয়, যার অর্থ এটিও যে নির্মাতাকে অবশ্যই শুরু থেকেই এটি প্ররোচিত করতে হবে। এর ফলে কিছু কি 'কাটা না করতে গুলি, তারা তা মেনে নেবে না হয়নি। এটি এর অর্থ হ'ল যে কোনও সাধারণ পূর্বপুরুষ কী আছে, ইন্টারফেসটি কীভাবে উপস্থাপন করে । এটি প্রাথমিক সমস্যার ক্ষেত্রে আবার চেনাশোনা করে object। এটি সহযোগীদের তাদের প্রয়োজনীয়তাগুলি অত্যধিক নির্দিষ্ট করে তোলে, একই সাথে কিছু অজানা ঘোষণার অভাবের কারণে অকার্যকর হতে পারে বা প্রত্যাশিত আচরণটি খারাপভাবে সংজ্ঞায়িত না হওয়ায় লুকানো গোচাচা হতে পারে।

কোনও টেম্পলেট ব্যবহারের জন্য প্রয়োজন যে সহযোগী সম্পূর্ণ অজানা কী নিয়ে কাজ করে এবং এর ইন্টারঅ্যাকশনগুলির মাধ্যমে এটি কীভাবে সংজ্ঞায়িত হয় । কিছুটা হলেও এই করে তোলে, কঠিন সহযোগীদের লেখা যেমন বিশ্লেষণ করা আবশ্যক কি তার যোগাযোগ প্রিমিটিভের জন্য (ফাংশন / ক্ষেত্র / ইত্যাদি) যখন সংকলন ত্রুটি এড়ানো, অথবা অন্তত বিন্দু কিভাবে একটি প্রদত্ত কি তার প্রয়োজনীয়তা সাথে মেলে না কিভাবে । এই সহযোগী কোনো থেকে পরম সর্বনিম্ন প্রয়োজন পারবেন কি , এর বিস্তৃত পরিসর, যার ফলে কি 'ব্যবহার করা থেকে s। দুর্ভাগ্যক্রমে এর অবজেক্টগুলির অযৌক্তিক ব্যবহারের অনুমতি দেওয়ার ক্ষয়ক্ষতি রয়েছে যা প্রযুক্তিগতভাবে কোনও প্রদত্ত যোগাযোগের আদিম ব্যবস্থা সরবরাহ করেকীভাবে , তবে সমস্ত ধরণের খারাপ জিনিস ঘটতে দেয় এমন অন্তর্নিহিত প্রোটোকলটি অনুসরণ করবেন না।

Iterators

এই ক্ষেত্রে একটি Iteratorহল ইন্টারঅ্যাকশন সম্পর্কিত একটি বিবরণের জন্য এটি কীভাবে শর্টহ্যান্ড। যে বর্ণনাটির সাথে মেলে এমন কোনও কিছুই সংজ্ঞা অনুসারে হয় Iteratorকীভাবে আমাদের সাধারণ অ্যালগরিদম লিখতে দেয় এবং অ্যালগরিদমের কাজটি করার জন্য ' কীভাবে একটি নির্দিষ্ট কী দেওয়া হয়' তার একটি সংক্ষিপ্ত তালিকা থাকতে পারে তা জেনে রাখা । সেই তালিকাটি হল ফাংশন / বৈশিষ্ট্য / ইত্যাদি, তাদের প্রয়োগগুলি অ্যালগরিদম দ্বারা সুনির্দিষ্টভাবে কী আচরণ করা হচ্ছে তা বিবেচনা করে।


6

কারণ সি ++ নেই প্রয়োজন পলিমরফিজম করতে (বিমূর্ত) বেস ক্লাস আছে। এতে কাঠামোগত সাব টাইপিংয়ের পাশাপাশি নমিনেটিভ সাব টাইপিং রয়েছে

বিভ্রান্তিকরভাবে আইট্রেটারগুলির বিশেষ ক্ষেত্রে, পূর্ববর্তী মানগুলি std::iterator(প্রায়) হিসাবে সংজ্ঞায়িত করা হয়

template <class Category, class T, class Distance = std::ptrdiff_t, class Pointer = T*, class Reference = T&>
struct iterator {
    using iterator_category = Category;
    using value_type = T;
    using difference_type = Distance;
    using pointer = Pointer;
    using reference = Reference;
}

অর্থ্যাৎ প্রয়োজনীয় সদস্য ধরণের সরবরাহকারী হিসাবে। এটির কোনও রানটাইম আচরণ ছিল না , এবং সি ++ 17 এ অবহেলা করা হয়েছিল

নোট করুন যে এমনকি এটি সাধারণ ভিত্তিও হতে পারে না, কারণ শ্রেণি টেম্পলেটটি কোনও শ্রেণি নয়, প্রতিটি ইনস্ট্যান্টেশন অন্যদের থেকে একা দাঁড়িয়ে থাকে।



5

একটি কারণ হ'ল পুনরাবৃত্তিকারীদের কোনও শ্রেণীর উদাহরণ হতে হবে না। পয়েন্টারগুলি বেশিরভাগ ক্ষেত্রে একেবারে ভাল পুনরাবৃত্তকারী হয়, উদাহরণস্বরূপ, এবং যেহেতু এগুলি আদিম হয় তারা কোনও কিছুর থেকে উত্তরাধিকারী হতে পারে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.