سؤال

لدي ناقل لـ myObjects في النطاق العالمي.لدي طريقة تستخدم ملف std::vector<myObject>::const_iterator لاجتياز المتجه وإجراء بعض المقارنات للعثور على عنصر محدد.بمجرد العثور على العنصر المطلوب، أريد أن أتمكن من إرجاع المؤشر إليه (المتجه موجود في النطاق العالمي).

إذا عدت &iterator, هل أقوم بإرجاع عنوان المكرر أو عنوان ما يشير إليه المكرر؟

هل أحتاج إلى إلقاء const_iterator العودة إلى myObject، ثم إرجاع عنوان ذلك؟

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

المحلول

والعودة عنوان الشيء أشار إليه مكرر:

&(*iterator)

تعديل: لتوضيح بعض اللبس:

vector <int> vec;          // a global vector of ints

void f() {
   vec.push_back( 1 );    // add to the global vector
   vector <int>::iterator it = vec.begin();
   * it = 2;              // change what was 1 to 2
   int * p = &(*it);      // get pointer to first element
   * p = 3;               // change what was 2 to 3
}

لا حاجة لناقلات مؤشرات أو التخصيص الحيوي.

نصائح أخرى

والعودة وسوف يعود مكرر عنوان مكرر. إذا كنت ترغب في العودة وسيلة للإشارة إلى العنصر إعادة مكرر نفسها.

وحذار أن لا تحتاج متجه ليكون عالمي من أجل إعادة مكرر / المؤشر ولكن العمليات في ناقلات يمكن أن يفسد مكرر. إضافة عناصر إلى متجه، على سبيل المثال، يمكن نقل عناصر المتجه إلى موضع آخر إذا كان حجم جديد () أكبر من الذاكرة المحجوزة. وحذف عنصر قبل بند معين من ناقلات جعل مكرر إشارة إلى عنصر مختلف.

في كلتا الحالتين، وهذا يتوقف على تنفيذ STL أنه يمكن أن يكون من الصعب تصحيح الأخطاء مع مجرد عشوائية يحدث كل ذلك في كثير من الأحيان.

وتحرير بعد تعليق: "نعم، لم أكن أريد أن يرجع مكرر أ) لأن CONST لها، وب) بالتأكيد أنها ليست سوى، مكرر مؤقت محلي؟ - Krakkos '

والتكرارات ليست أكثر أو أقل المحلي أو مؤقتة من أي متغير آخر وهم copyable. يمكنك إعادته وسوف مترجم تجعل نسخة بالنسبة لك لأنها سوف مع المؤشر.

والآن مع CONST نيس. إذا كان الطالب يرغب في إجراء التعديلات من خلال العنصر عاد (سواء المؤشر أو مكرر) ثم يجب عليك استخدام مكرر غير CONST. (فقط إزالة "const_ 'من تعريف مكرر).

إنها ليست فكرة جيدة إرجاع التكرارات.تصبح المُكرِّرات غير صالحة عند حدوث تعديلات على المتجه (inversion\deletion).أيضًا، المكرِّر هو كائن محلي تم إنشاؤه على المكدس، وبالتالي فإن إرجاع العنوان نفسه ليس آمنًا على الإطلاق.أقترح عليك العمل مع myObject بدلاً من التكرارات المتجهة.

يحرر:إذا كان الكائن خفيف الوزن فمن الأفضل أن تقوم بإرجاع الكائن نفسه.بخلاف ذلك، قم بإرجاع المؤشرات إلى myObject المخزنة في المتجه.

وطالما بقي ناقلات الخاصة بك في نطاق عالمي يمكنك العودة:

&(*iterator)

وأنا أحذر لكم أن هذا أمر خطير جدا بشكل عام. إذا ناقلات الخاص بك يتم نقل أي وقت مضى للخروج من نطاق عالمي وغير دمرت، أي مؤشرات إلى myObject تصبح غير صالحة. إذا كنت تكتب هذه الوظائف كجزء من مشروع أكبر، ليعود مؤشر غير CONST يمكن أن تؤدي شخص لحذف قيمة الإرجاع. هذا وسوف يكون لها آثار غير محددة، والكارثية، على التطبيق.

وكنت إعادة كتابة هذا على النحو التالي:

myObject myFunction(const vector<myObject>& objects)
{
    // find the object in question and return a copy
    return *iterator;
}

إذا كنت تحتاج إلى تعديل myObject عاد، تخزين القيم الخاصة بك على المؤشرات وتخصيصها على كومة:

myObject* myFunction(const vector<myObject*>& objects)
{
    return *iterator;
}

وبهذه الطريقة يكون لديك السيطرة على انهم عندما دمر.

وشيء من هذا القبيل سيتم قطع التطبيق الخاص بك:

g_vector<tmpClass> myVector;

    tmpClass t;
    t.i = 30;
    myVector.push_back(t);

    // my function returns a pointer to a value in myVector
    std::auto_ptr<tmpClass> t2(myFunction());

يمكنك استخدام ال بيانات وظيفة المتجه:

إرجاع مؤشر إلى العنصر الأول في المتجه.

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

//the index to the element that you want to receive its pointer:
int i = n; //(n is whatever integer you want)

std::vector<myObject> vec;
myObject* ptr_to_first = vec.data();

//or

std::vector<myObject>* vec;
myObject* ptr_to_first = vec->data();

//then

myObject element = ptr_to_first[i]; //element at index i
myObject* ptr_to_element = &element;

ويقول، كنت قد ما يلي:

std::vector<myObject>::const_iterator first = vObj.begin();

وبعد ذلك الكائن الأول في ناقلات هو: *first. للحصول على عنوان، استخدام: &(*first)

ولكن، تمشيا مع التصميم STL، كنت تشير الى عودة مكرر بدلا من ذلك إذا كنت تخطط لتمرير حولها في وقت لاحق إلى خوارزميات STL.

وأنت تخزين نسخ من myObject في ناقلات. لذلك أعتقد أن النسخ مثيل myObject ليس عملية مكلفة. ثم أعتقد أن أسلم تكون العودة على نسخة من myObject من وظيفة الخاص بك.

ارجع إلى إجابات dirkgently و anon، يمكنك الاتصال بـ أمام وظيفة بدلا من يبدأ وظيفة، لذلك عليك أن تفعل لا يجب أن أكتب *, ، ولكن فقط &.

مثال الكود:

vector<myObject> vec; //You have a vector of your objects
myObject first = vec.front(); //returns reference, not iterator, to the first object in the vector so you had only to write the data type in the generic of your vector, i.e. myObject, and not all the iterator stuff and the vector again and :: of course
myObject* pointer_to_first_object = &first; //* between & and first is not there anymore, first is already the first object, not iterator to it.

ولست متأكدا إذا كانت هناك حاجة عودته عنوان الشيء أشار من قبل مكرر. كل ما تحتاجه هو مؤشر نفسها. سترى الطبقة مكرر STL في حد ذاته تنفيذ استخدام _Ptr لهذا الغرض. لذلك، لا مجرد:

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