আমার নিজস্ব আইট্রেটার তৈরি করা হচ্ছে


141

আমি সি ++ শিখার চেষ্টা করছি তাই আমাকে ক্ষমা করুন যদি এই প্রশ্নটি মৌলিক জ্ঞানের অভাব দেখায়, আপনি দেখেন, সত্যতা হচ্ছে, আমার কাছে প্রাথমিক জ্ঞানের অভাব রয়েছে।

আমি যে ক্লাসটি তৈরি করেছি তার জন্য ইটারেটর কীভাবে তৈরি করা যায় সে সম্পর্কে কাজ করতে কিছু সহায়তা চাই want

আমার একটি ক্লাস 'শেপ' রয়েছে যার পয়েন্টের ধারক রয়েছে। আমার একটি ক্লাস 'পিস' রয়েছে যা একটি শেপকে রেফার করে এবং শেপের জন্য অবস্থান নির্ধারণ করে। পিসের আকার নেই এটি কেবল একটি আকারের উল্লেখ করে।

আমি দেখতে চাই, পিসটি পয়েন্টগুলির একটি ধারক যা আকারের রেফারেন্সের সাথে একই তবে পিসের অবস্থানের অফসেট যুক্ত করে।

আমি পিসের পয়েন্টগুলিতে পুনরাবৃত্তি করতে সক্ষম হতে চাই যেমন পিস নিজেই একটি ধারক ছিল। আমি চারপাশে কিছুটা পড়া করেছি এবং এমন কিছু খুঁজে পাইনি যা আমাকে সাহায্য করেছে। আমি কোন পয়েন্টার জন্য খুব কৃতজ্ঞ হবে।


6
স্যাম্পল কোড পোস্ট করা কেবল সাধারণ সরল ইংরেজী পাঠ্যের চেয়ে আপনি কী ভাল করছেন তা বর্ণনা করতে সহায়তা করবে।
গ্রেগ রজার্স

3
কাস্টম iterators তৈরি করা হচ্ছে সম্ভবত না মৌলিক উপরে, মাধ্যমিক অন্তত।
ldog

উত্তর:


41

আপনার বুস্ট.আইট্রেটার ব্যবহার করা উচিত। এটিতে বিদ্যমান পুনরাবৃত্তকারীদের জন্য নতুন পুনরাবৃত্তকারী এবং অ্যাডাপ্টার প্রয়োগ করতে বেশ কয়েকটি টেম্পলেট এবং ধারণা রয়েছে। আমি এই বিষয়টি নিয়ে একটি নিবন্ধ লিখেছি ; এটি ডিসেম্বর ২০০ A এর এসিসিইউ ম্যাগাজিনে। এটি ঠিক আপনার সমস্যার জন্য একটি (আইএমও) মার্জিত সমাধান নিয়ে আলোচনা করেছে: বুস্ট.আইট্রেটর ব্যবহার করে কোনও বস্তু থেকে সদস্য সংগ্রহ প্রকাশ করা।

আপনি যদি কেবল স্টল ব্যবহার করতে চান, জোসুটিস বইতে আপনার নিজস্ব এসটিএল পুনরায় ব্যবহারকারীর প্রয়োগের একটি অধ্যায় রয়েছে।


3
কেবল একটি ছোট্ট মন্তব্য: বইটি সি ++ স্ট্যান্ডার্ড লাইব্রেরি সম্পর্কে বলেছে, এসটিএল নয় - এগুলি পৃথক, তবে অনেক গুলিয়ে যায় (আমিও অপরাধী / আমিও)
সিপিসি ক্রিস

62

/ সম্পাদনা: আমি দেখতে পাচ্ছি, এখানে একটি নিজস্ব পুনরুক্তি করা প্রয়োজন (আমি প্রথমে প্রশ্নটি ভুলভাবে লিখেছি)। তবুও, আমি নীচের কোডটি দাঁড়াতে দিচ্ছি কারণ এটি একই পরিস্থিতিতে কার্যকর হতে পারে।


একটি নিজস্ব পুনরুক্তি এখানে আসলে প্রয়োজনীয়? সম্ভবত এটি সমস্ত প্রয়োজনীয় সংজ্ঞাটিকে প্রকৃত পয়েন্টগুলিতে ধারক করে এগিয়ে দেওয়ার পক্ষে:

// Your class `Piece`
class Piece {
private:
    Shape m_shape;

public:

    typedef std::vector<Point>::iterator iterator;
    typedef std::vector<Point>::const_iterator const_iterator;

    iterator begin() { return m_shape.container.begin(); }

    const_iterator begin() const { return m_shape.container.begin(); }

    iterator end() { return m_shape.container.end(); }

    const_iterator end() const { return m_shape.const_container.end(); }
}

এটি ধরে নেওয়া হচ্ছে আপনি vectorঅভ্যন্তরীণভাবে ব্যবহার করছেন তবে ধরণটি সহজেই মানিয়ে নেওয়া যায়।


সম্ভবত তিনি নিজের শ্রেণীর বিপরীতে এসটিএল অ্যালগরিদম বা কার্যকরী বৈশিষ্ট্যগুলি ব্যবহার করতে চান ...
gbjbaanb

2
মূল প্রশ্নটি আসলে বলে যে টুকরা ধারকটির পুনরাবৃত্তকারীগুলির মানগুলি ফেরত দেওয়ার সময় তাদের সংশোধন করা উচিত। এটির জন্য পৃথক পুনরাবৃত্তির প্রয়োজন হবে যদিও এটি সম্ভবত উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া উচিত বা অন্যথায় মূল থেকে বেশিরভাগ ক্ষেত্রেই নেওয়া উচিত।
workmad3

@gbjbaanb: আমার কোড সম্পর্কে ভাল জিনিসটি এটি এসটিএল অ্যালগরিদম দ্বারা ব্যবহার করা যেতে পারে।
কনরাড রুডল্ফ

1
কয়েক বছর পরে এবং এটি এখনও গুগলে শীর্ষস্থানীয় ফলাফলগুলির মধ্যে রয়েছে ... এটির মতো কিছু করে এখন এটি সাধারণকরণ করা সম্ভব:auto begin() -> decltype(m_shape.container.begin()) { return m_shape.container.begin(); }
ব্যবহারকারী 2962533

20

এখানে কাস্টম কনটেইনারের মতো একটি এসটিএল ডিজাইনিং করা একটি নিবন্ধ যা একটি কনটেইনার শ্রেণীর মতো একটি এসটিএল এর জন্য পুনরাবৃত্ত শ্রেণীর পাশাপাশি ডিজাইন করা যায় তার কয়েকটি প্রাথমিক ধারণাটি ব্যাখ্যা করে। বিপরীত পুনরুক্তি (সামান্য শক্ত) যদিও অনুশীলন হিসাবে বাকি রয়েছে :-)

আছে HTH,



2

সি ++ তে কাস্টম পুনরাবৃত্তকারীগুলি লেখা বেশ ভার্জোজ এবং জটিল হতে পারে।

যেহেতু আমি কাস্টম পুনরাবৃত্তকারী লেখার কোনও সর্বনিম্ন উপায় খুঁজে পাইনি আমি এই টেমপ্লেট শিরোনামটি লিখেছি যা সাহায্য করতে পারে। উদাহরণস্বরূপ, Pieceক্লাসটি পুনরাবৃত্তিযোগ্য করতে:

#include <iostream>
#include <vector>

#include "iterator_tpl.h"

struct Point {
  int x;
  int y;
  Point() {}
  Point(int x, int y) : x(x), y(y) {}
  Point operator+(Point other) const {
    other.x += x;
    other.y += y;
    return other;
  }
};

struct Shape {
  std::vector<Point> vec;
};

struct Piece {
  Shape& shape;
  Point offset;
  Piece(Shape& shape, int x, int y) : shape(shape), offset(x,y) {}

  struct it_state {
    int pos;
    inline void next(const Piece* ref) { ++pos; }
    inline void begin(const Piece* ref) { pos = 0; }
    inline void end(const Piece* ref) { pos = ref->shape.vec.size(); }
    inline Point get(Piece* ref) { return ref->offset + ref->shape.vec[pos]; }
    inline bool cmp(const it_state& s) const { return pos != s.pos; }
  };
  SETUP_ITERATORS(Piece, Point, it_state);
};

তারপরে আপনি এটিকে একটি সাধারণ এসটিএল ধারক হিসাবে ব্যবহার করতে সক্ষম হবেন:

int main() {
  Shape shape;
  shape.vec.emplace_back(1,2);
  shape.vec.emplace_back(2,3);
  shape.vec.emplace_back(3,4);

  Piece piece(shape, 1, 1);

  for (Point p : piece) {
    std::cout << p.x << " " << p.y << std::endl;
    // Output:
    // 2 3
    // 3 4
    // 4 5
  }

  return 0;
}

এটি অন্যান্য ধরণের পুনরাবৃত্তির মতো const_iteratorবা যুক্ত করতেও সহায়তা করে reverse_const_iterator

আমি আসা করি এটা সাহায্য করবে.


1

আপনার সমস্যার সমাধানটি আপনার নিজের পুনরাবৃত্তকারী তৈরি নয়, বিদ্যমান এসটিএল পাত্রে এবং পুনরুক্তিগুলির ব্যবহার। ভেক্টরের মতো পাত্রে প্রতিটি আকারের পয়েন্টগুলি সংরক্ষণ করুন।

class Shape {
    private:
    vector <Point> points;

তারপরে আপনি যা করেন তা নির্ভর করে আপনার ডিজাইনের উপর। শেপের অভ্যন্তরে পদ্ধতিগুলির মধ্যে পয়েন্টগুলির মাধ্যমে পুনরাবৃত্তি হওয়াই সর্বোত্তম পন্থা।

for (vector <Point>::iterator i = points.begin(); i != points.end(); ++i)
    /* ... */

আপনার যদি শেপের বাইরের পয়েন্টগুলিতে অ্যাক্সেসের প্রয়োজন হয় (এটি কোনও ঘাটতি নকশার চিহ্ন হতে পারে) আপনি শেপ পদ্ধতিতে তৈরি করতে পারেন যা পয়েন্টগুলির জন্য পুনরাবৃত্তকারী অ্যাক্সেস ফাংশনগুলি ফিরিয়ে দেবে (সেক্ষেত্রে পয়েন্ট ধারকগুলির জন্য একটি পাবলিক টাইপডেফও তৈরি করবে)। এই পদ্ধতির বিশদ জানতে কনরাড রুডলফের উত্তরটি দেখুন।


3
তার এখনও তার নিজস্ব পুনরুক্তি তৈরি করতে হবে যা সেই টুকরোটিতে থাকা আকারগুলিতে টুকরো টুকরো করার অনুরোধ জানাবে। কাস্টম পুনরাবৃত্তি এখানে দুর্দান্ত সরঞ্জাম, এবং ব্যবহারের জন্য খুব মার্জিত।
রোল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.