سؤال

كيفية تعيين كافة القيم في std::map إلى نفس القيمة، دون استخدام حلقة تتكرر على كل قيمة؟

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

المحلول

يحتوي C++ على fill الطريقة من <algorithm> ولكن هذا لا يعمل مع الخرائط.في الواقع، دعم الخوارزمية للحاويات الترابطية ليس جيدًا بشكل عام.

ونتيجة لذلك، سيتعين عليك استخدام تفاعل أو كتابة عامل مناسب لاستخدامه معه for_each (لكنني أعتبر هذا عبئًا غير ضروري):

template <typename TKey, typename TValue>
struct resetter : public std::unary_function<std::pair<TKey, TValue> > {
    TValue const value;

    public resetter(value const& v) : value(v) { }

    public void operator ()(std::pair<TKey, TValue>& v) {
        v.second = value;
    }
};

for_each(map.begin(), map.end(), resetter<Key, Value>(value));

نصائح أخرى

لقد واجهت نفس المشكلة ولكني وجدت أن النطاق الذي تم إرجاعه بواسطة Boost::adaptors::values ​​قابل للتغيير، لذا يمكن استخدامه بعد ذلك مع الخوارزميات العادية مثل std::fill.

#include <boost/range/adaptor/map.hpp>
auto my_values = boost::adaptors::values(my_map);
std::fill(my_values.begin(), my_values.end(), 123);

تحتوي مكتبة Boost::sign على جميع أنواع الأشياء الرائعة للمساعدة في تهيئة محتويات الحاوية.أعتقد أنه يمكن استخدام هذا لتجنب التكرار بشكل صريح عبر الخريطة.لسوء الحظ، تعد الخرائط بمثابة وحوش غريبة يصعب تهيئتها لأن المفاتيح يجب أن تكون فريدة من نوعها.خلاصة القول هي أن حلقة for البسيطة ربما تكون أفضل طريقة لتهيئة الخريطة.قد لا يكون هذا الكتاب أنيقًا للغاية، لكنه ينجز المهمة ويسهل فهمه على الفور من قبل أي شخص لديه أي معرفة بالمحكمة الخاصة بلبنان.

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));

يصف باقي هذا المنشور الرحلة التي قمت بها للوصول إلى الاستنتاج أعلاه.

يُسهّل التعزيز :: التعيين تعيين عدد صغير من القيم للخريطة.

map<string,int> m; 
insert( m )( "Bar", 1 )( "Foo", 2 );

أو

 map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

في حالتك، حيث تريد تهيئة الخريطة بأكملها بنفس القيمة، توجد الأدوات المساعدة Repeat و Repeat_fun.
شيء من هذا القبيل يجب أن يعمل مع خريطة متعددة (مقتطف كود لم يتم اختباره)

pair<int,string> init( 0,string(""));
multimap <int,string> myMap = repeat(1000,init);

كما أشار كونراد رودولف، لا يمكنك تهيئة الخريطة بنفس القيمة الدقيقة، لأن المفاتيح يجب أن تكون فريدة.

وهذا يجعل الحياة أكثر تعقيدًا (متعة؟).ربما شيء من هذا القبيل:

map <int,string> myMap;

struct nextkey
{
   int start;
   nextkey( s ) : start( s ) {}
   pair<int,string> operator () ()
{
   return pair<int,string>(start++,string(""));
}
};

myMap = repeat_fun(1000,nextkey(0));

الآن، أصبح الأمر معقدًا للغاية، وأعتقد الآن أن التكرار البسيط هو الحل الأمثل

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top