الوصول إلى عناصر ناقلات داخل متجه آخر من خلال جهاز كمتقل؟

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

  •  09-09-2019
  •  | 
  •  

سؤال

std::vector< std::vector<coords> >::iterator iter;
for(iter = characters.begin(); iter != characters.end(); iter++) 
{
    std::vector<coords>* cha = iter; // doesn't work.
}

// does work.
std::vector<coords>* character = &characters.at(0);
coords* first = &character->at(0);

وأنا لا أفهم لماذا. ليس من المفترض أن يكون iTer مؤشرا إلى عنصر من نوع الحاوية التي يفترض أنها "تحتوي"؟

أي شخص يرغب في إلقاء الضوء على هذا؟

من خلال عدم العمل أقصد:

error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::vector<_Ty> *'

التي لا تجعل الكثير من المعنى بالنسبة لي.

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

المحلول

جهاز كمتدرج هو نوع يمكن تغييره مثل مؤشر، أي أن لديها صريح operator*() و operator->(). وبعد لا يجب أن يكون مؤشرا.

لذلك استخدام &*iter إذا كنت ترغب في الحصول على عنوان المتجه.

نصائح أخرى

لتوضيح مزيد من إجابة MSN، يمكنك التفكير في المحام بمثابة غلاف بمنع فردي من الحاوية، ولكنه يحتوي أيضا على بعض الذكاء لزيادة (++ Iter)، وتناقص (++ ITER) إلخ. قد لا يكون بنية البيانات كتلة متجاورة من الذاكرة اعتمادا على نوع الحاوية / التنفيذ. للوصول إلى القيمة الفعلية، يمكنك

1) derefence للماء، على سبيل المثال

Type t = *iter;

2) علاج المؤتمر كمؤشر إلى نوع الحاوية، على سبيل المثال

iter->someFuncOnTheContainerType();

أعلم أنه من الواضح الآن (بالخريم)، ولكن في حلقة الخاص بك يمكنك أيضا محاولة:

std::vector<coords> & cha = * iter;

أيضا، ليس ما تطلبه، وعادل لمعلوماتك، لكن المتجهات تدعم محاماة الوصول العشوائي. وهذا يعني أنك يمكن أن تكتب أيضا:

for( size_t i=0; i<characters.size();  i ++ )

وإذا كنت بحاجة إلى تحويل مرة أخرى إلى جهاز استئناف، يمكنك استخدام:

characters.begin() + i

إنها ليست طريقة C ++ للقيام بالأشياء، فهي تنفصل فلسفة المحامرة العامة، لكنها لها استخداماتها.

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