الترميز المتعلم مقابل.الأمراض المنقولة جنسيا::زوج، حلول؟

StackOverflow https://stackoverflow.com/questions/1042277

  •  22-07-2019
  •  | 
  •  

سؤال

كمعظم المبرمجين، فأنا معجب بمبادئ البرمجة القراءة والكتابة وأحاول اتباعها، ولكن في لغة C++ أجد نفسي أستخدمها بشكل روتيني std::pair, ، لعدد كبير من المهام المشتركة.لكن std::pair هو، IMHO، عدو خسيس للبرمجة المتعلمة ...

وجهة نظري هي عندما أعود إلى التعليمات البرمجية التي كتبتها قبل يوم أو يومين، وأرى تلاعبًا في ملف std::pair (عادةً كمكرر) أتساءل لنفسي "ماذا يعني iter->الأول و iter->الثاني؟؟؟".

أعتقد أن الآخرين لديهم نفس الشكوك عند النظر إليهم std::pair الكود، لذلك كنت أتساءل، هل توصل أي شخص إلى بعض الحلول الجيدة لاستعادة القراءة والكتابة عند الاستخدام std::pair?

هل كانت مفيدة؟

المحلول

وماذا عن هذا:

struct MyPair : public std::pair < int, std::string >
{
    const int& keyInt() { return first; }
    void keyInt( const int& keyInt ) { first = keyInt; }
    const std::string& valueString() { return second; }
    void valueString( const std::string& valueString ) { second = valueString; }
};

وانها مطول بعض الشيء، ولكن استخدام هذا في التعليمات البرمجية قد جعل الأمور أسهل قليلا لقراءة، على سبيل المثال:

std::vector < MyPair > listPairs;

std::vector < MyPair >::iterator iterPair( listPairs.begin() );
if ( iterPair->keyInt() == 123 )
    iterPair->valueString( "hello" );

وبخلاف ذلك، لا أستطيع أن أرى أي حل سحري ما يجري لجعل الأمور أكثر وضوحا.

نصائح أخرى

وstd::pair هو وسيلة جيدة لكسب نوع "المحلية" ومجهول أساسا مع الأعمدة مجهول أساسا. إذا كنت تستخدم زوج معين على مساحة معجمي كبير بحيث تحتاج إلى اسم نوع والأعمدة، ويهمني ان استخدام struct عادي بدلا من ذلك.

typedef std::pair<bool, int> IsPresent_Value;
typedef std::pair<double, int> Price_Quantity;

... تحصل على هذه النقطة.

ويمكنك إنشاء اثنين من أزواج من حاصل (CONST وغير) من شأنها أن مجرد العودة إشارة إلى الأولى والثانية، ولكن سيكون أكثر قابلية للقراءة من ذلك بكثير. على سبيل المثال:

string& GetField(pair& p) { return p.first; }
int& GetValue(pair& p) { return p.second; }

وسوف تتيح لك الحصول على أعضاء الميدانية وقيمة من زوج معين دون الحاجة إلى تذكر أي عضو يحمل ما.

إذا كنت تتوقع أن استخدام هذا كثيرا، هل يمكن أيضا إنشاء ماكرو من شأنها أن تولد تلك حاصل بالنسبة لك، نظرا للأسماء وأنواع: MAKE_PAIR_GETTERS (حقل، سلسلة، القيمة، الباحث) أو نحو ذلك. جعل حاصل اضحة وربما يسمح للمترجم لتحسين بها بعيدا، ولذلك سوف تضيف أي النفقات العامة في وقت التشغيل. وباستخدام الماكرو وجعلها مبكرة لخلق تلك حاصل لأي استخدام جعل لكم من أزواج.

يمكنك استخدام الصفوف المعززة، لكنها لا تغير المشكلة الأساسية حقًا:قم بدورك حقًا تريد الوصول إلى كل جزء من الزوج/الصف بنوع متكامل صغير، أو هل تريد المزيد من التعليمات البرمجية "القراءة والكتابة".يرى هذا السؤال لقد نشرت منذ فترة.

لكن، تعزيز::اختياري هي أداة مفيدة وجدتها تحل محل عدد لا بأس به من الحالات التي يتم فيها وصف الأزواج/الصفوف كإجابة.

لقد وجدت نفسي مؤخرًا أستخدم boost::tuple كبديل ل std::pair.يمكنك تحديد العدادين لكل عضو وبالتالي يكون من الواضح ما هو كل عضو:

typedef boost::tuple<int, int> KeyValueTuple;
enum {
  KEY
  , VALUE
};

void foo (KeyValueTuple & p) {
    p.get<KEY> () = 0;
    p.get<VALUE> () = 0;
}

void bar (int key, int value)
{
  foo (boost:tie (key, value));
}

راجع للشغل، نرحب بالتعليقات حول ما إذا كانت هناك تكلفة خفية لاستخدام هذا النهج.

يحرر:إزالة الأسماء من النطاق العالمي.

مجرد تعليق سريع بخصوص مساحة الاسم العالمية.بشكل عام سأستخدم:

struct KeyValueTraits
{
  typedef boost::tuple<int, int> Type;
  enum {
    KEY
    , VALUE
  };
};

void foo (KeyValueTuple::Type & p) {
    p.get<KeyValueTuple::KEY> () = 0;
    p.get<KeyValueTuple::VALUE> () = 0;
}

يبدو أن الأمر كذلك boost::fusion لا يربط الهوية والقيمة معًا.

وكما ذكر أليكس، std::pair مريحة للغاية ولكن عندما يحصل الخلط بين إنشاء بنية واستخدامه في نفس الطريق، وإلقاء نظرة على كود std::pair، انها ليست معقدة.

وأنا لا أحب الأمراض المنقولة جنسيا :: الزوج كما هو مستخدم في الأمراض المنقولة جنسيا :: خريطة سواء، وإدخالات خريطة كان ينبغي أن يكون أعضاء المفتاح والقيمة.
حتى أنا استخدم دفعة :: MIC لتجنب هذا. ومع ذلك، وتعزيز :: كما يأتي MIC مع التكلفة.

وبالإضافة إلى ذلك، إرجاع نتائج الأمراض المنقولة جنسيا :: الزوج في أقل من كود للقراءة:

if (cntnr.insert(newEntry).second) { ... }

و؟؟؟

ولقد وجدت أيضا أن الأمراض المنقولة جنسيا :: الزوج يستخدم عادة من قبل المبرمجين الذين يحتاجون كسول 2 القيم ولكن لم نفكر لماذا هذه القيم عند الحاجة معا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top