سؤال

لدي خريطة تجزئة محددة على أنها

class KeyType {
    int key;
    mutable bool flag;
    KeyType(int key) : key(key), flag(false) {}
    void setFlag() const { flag = true; }
};

struct KeyType_hasher {
    size_t operator()(const KeyType& s) const {
        return static_cast<size_t> key;
    }
};

struct KeyType_equal {
    size_t operator()(const KeyType& s1, const KeyType& s2) const {
        return s1.key == s2.key;
    }
};

typedef hash_map<KeyType , ValueType, KeyType_hasher, KeyType_equal > KeyValueMap;

في وقت لاحق في الكود ، لديّ مكان يجب أن أحلق فيه على الرغم من الخريطة وتطبيق وظيفة على كل قيمة أجدها. بناءً على نتيجة الوظيفة ، يجب علي تعديل المفتاح في المكرر أيضًا.

KeyValueMap theMap;
// theMap[key1] = value1;
// theMap[key2] = value2;
// theMap[key3] = value3;
for(KeyValueMap::iterator i = theMap.begin(); i != theMap.end(); ++i) {
    if(true == ValueFunction(i->second))
        i->first.setFlag();
}

سؤالي هو ، هل ستكون هذه هي الطريقة الصحيحة لتعديل المفتاح ، إذا كان علي ذلك؟ هل لها أي آثار جانبية سيئة؟

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

المحلول

يجب عليك إزالة العنصر من الحاوية وإعادة إضافةه بالمفتاح الجديد.

لا تدعم أي من الحاويات الترابطية C ++ تغيير المفتاح بطريقة مهمة (حيث كبير يعني أن التغيير يغير نتائج التجزئة في حاوية تجزئة أو comparrsion في حاوية مرتبة).

إذا قمت بتعديل المفتاح (عن طريق التحايل على نظام صواب const بطريقة ما) ، فستحصل على نتائج غير متوقعة من عمليات البحث.

نصائح أخرى

لا يمكنك فقط تغيير المفتاح لأنه ملف const عضو في pair, ، لا يمكنك محو أو إدراج الأعضاء في hash_map دون إبطال المتكرر ، i, ، عندك. متى i يتم إبطاله ، لا يمكنك زيادة ذلك للحصول على العنصر التالي من الحاوية.

قد يكون هناك (وربما) خوارزمية أفضل ، لكن ما أعتقد أنه ستحتاج إليه هو تخزين نسخ من العناصر (أو فقط المفاتيح) للعناصر التي تريد تغيير المفاتيح لها في حاوية مؤقتة أخرى في الخاص بك for عقدة. ثم قم بالسير في حاوية temorderary واستخدم المعلومات الموجودة فيها إلى:

  • احصل على العنصر الذي تريد تغيير المفتاح له في الأصل hash_map حاوية
  • erase() هذا العنصر من الحاوية الأصلية
  • insert() عنصر جديد مع المفتاح الجديد والقيمة الأصلية مرة أخرى في hash_map

ثم يمكنك تفريغ الحاوية المؤقتة.

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