كيف يمكنني استخدام خوارزميات STL مع متجه من المؤشرات

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

سؤال

ولدي متجه من المؤشرات التي لا يملكها الحاوية. كيف يمكنني استخدام خوارزميات على أهداف المؤشرات. حاولت استخدام ptr_vector دفعة، لكنه يحاول حذف المؤشرات عندما يخرج من النطاق.

وهنا بعض التعليمات البرمجية التي يحتاج إلى العمل:

vector<int*> myValues;
// ... myValues is populated
bool consistent = count(myValues.begin(), myValues.end(), myValues.front()) == myValues.size();
auto v = consistent ? myValues.front() : accumulate(myValues.begin(), myValues.end(), 0) / myValues.size();
fill(myValues.begin(), myValues.end(), v);
// etc.

وأنا أدرك أن ستعمل على الحلقات، ولكن هذا يحدث في مجموعة من الأماكن، وذلك نوع من محول أحادي؟ لم أكن قادرا على العثور على واحد. ويرجع الفضل في ذلك مسبقا!

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

المحلول

هل يمكن استخدام زيادة غير المباشر مكرر . عندما ألغى الإشارة القيمة (مع operator*())، فإنه يطبق <م> إلى dereference اضافية، حتى ينتهي بك الأمر مع قيمة وأشار من قبل مؤشر المشار إليه بواسطة مكرر. لمزيد من المعلومات، يمكنك ان ترى أيضا هذا سؤال حول dereference مكرر .

وهنا مثال بسيط:

std::vector<int*> vec;

vec.push_back(new int(1));
vec.push_back(new int(2));

std::copy(boost::make_indirect_iterator(vec.begin()),
          boost::make_indirect_iterator(vec.end()),
          std::ostream_iterator<int>(std::cout, " "));     // Prints 1 2

نصائح أخرى

bool consistent = count_if(myValues.begin(), myValues.end(), 
   bind2nd(ptr_fun(compare_ptr), *myValues.front())) == myValues.size();

int v = consistent ? *myValues.front() : accumulate(
   myValues.begin(), myValues.end(), 0, sum_int_ptr) / myValues.size();

for_each(myValues.begin(), myValues.end(), bind1st(ptr_fun(assign_ptr),v));

والتعبئة لا يمكن أن تعيين وظيفة (بحيث dereference مؤشرات). لذا، تم استخدام for_each (). لتحسين أنه سيكون من الحكمة أن تضيف إذا (! ثابت) قبل تشغيل for_each (). الوظائف المستخدمة في أعلى STL واحد المتشددين:

int sum_int_ptr(int total, int * a) { return total + *a; }    
void assign_ptr(int v, int *ptr) { *ptr = v; }    
bool compare_ptr(int* a, int pattern) { return *a == pattern; }

ويمكنك إلقاء نظرة على boost::shared_ptr<> - مؤشر الذكية مع حساب مرجع. وسوف يتم حذف المؤشر بعد أن يخرج من النطاق.

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