هل هناك كائن وظيفة معيار C ++ لتفكيك والأمراض المنقولة جنسيا :: الزوج؟

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

سؤال

لا أحد يعرف إذا كان هناك معيار الأمر الواقع (أي TR1 أو دفعة) C ++ الكائن وظيفة للوصول إلى عناصر الأمراض المنقولة جنسيا :: الزوج؟ مرتين خلال ال 24 ساعة الماضية لقد تمنى كان لي شيء من هذا القبيل وظيفة keys للبيرل علامات الرقم. على سبيل المثال، سيكون من الجميل لتشغيل الأمراض المنقولة جنسيا :: تحويل على كائن الأمراض المنقولة جنسيا :: الخريطة وتفريغ جميع مفاتيح (أو قيم) إلى حاوية أخرى. أنا بالتأكيد يمكن أن يكتب مثل هذا الكائن وظيفة ولكن كنت أفضل أن إعادة استخدام شيء ما لديها الكثير من مقل العيون على ذلك.

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

المحلول

وboost::bind هو ما كنت تبحث عنه.

boost::bind(&std::pair::second, _1); // returns the value of a pair

مثال:

typedef std::map<std::string, int> map_type;

std::vector<int> values; // will contain all values
map_type map;
std::transform(map.begin(), 
               map.end(), 
               std::back_inserter(values), 
               boost::bind(&map_type::value_type::second, _1));

نصائح أخرى

ومن الطريقة التي صيغت سؤالك، أنا لست متأكد من أن هذا هو الرد المناسب، ولكن حاول boost::tie (جزء من دفعة :: مكتبة الصفوف (tuple)). وهي تعمل على std::pairs جدا.

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

void print_string(const std::string& s) {
  std::cout << s << '\n';
}


std::map<int,std::string> my_map;
my_map[0]="Boost";
my_map[1]="Bind";


std::for_each(my_map.begin(), my_map.end(),
              boost::bind(&print_string, boost::bind(
              &std::map<int,std::string>::value_type::second,_1)));

وماذا عن استخدام مزيج من حاويات مختلفة.

وعلى سبيل المثال عندما أردت أن تقسيم متجه إلى البنود الواردة في خريطة تكميلية والعناصر التي فيها غير وارد في خريطة تكميلية اعتدت ما يلي:

typedef int DWORD; 
typedef std::pair<std::string, bool> user_info; 
typedef std::map<DWORD, user_info> USER_MAP; 
typedef std::vector<DWORD> VEC_STAFF; 

VEC_STAFF::iterator it = std::partition(Staff.begin(), Staff.end(), (bind(&USER_MAP::find, m_Users, _1) != m_Users.end()));

والآن لدي مشكلة الثانية - أثناء تشغيل التطبيق منطقي وضع user_info يمكن أن تتغير، وبعد ذلك أريد أن إعادة تقسيم متجه مع العناصر التي لها منطقي وضع صحيح وليس فقط يجري الواردة في خريطة تكميلية.

ولكن يبدو لي أن لديك مشكلة الوصول إلى البند الثاني من زوج متداخلة.

وحاولت التالية ولكن لا أستطيع أن يبدو للوصول إلى الزوج متداخلة!

CActiveUsers::VEC_STAFF::const_iterator itCurEnd = partition(Staff.begin(), Staff.end(), bind(&USER_MAP::value_type::second::second, bind(&USER_MAP::find, &m_Users, _1)) == true); 

ونلقي نظرة على دفعة :: المحولات. هناك محولات محددة مسبقا لبالتكرار عبر مفاتيح الخريطة أو القيم دون نسخ منها إلى وعاء وسيطة.

والخيار الوحيد الذي لم المقترح هو std::tr1::get. انظر الأقسام 6.1.2 و 6.1.4 من n1745 .

std::pair< std::string, int > p( "foo", 1729 );

int hr = std::tr1::get< 1 >( p );

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

typedef std::map<std::string, int> map_type;

std::vector<int> values; // will contain all values
map_type map;

// std::tr1::get is overloaded so we need to help the compiler choose
const map_type::value_type::second_type & (*get)( const map_type::value_type & ) =
  &std::tr1::get< 1, map_type::value_type::first_type, map_type::value_type::second_type >;

std::transform(map.begin(), 
               map.end(), 
               std::back_inserter(values), 
               get);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top