ควบคุมไหลเวียนกับ iterators

0

คำถาม

บอกว่าฉันมีบางอย่างเหมือนนี้:

void myFunk(std::vector<T>& v, std::vector<T>::iterator first, std::vector<T>::iterator last) {
    while (first != last) {
        if ((*first) > (*last)) {
            T someT;
            v.push_back(someT);
        }
        first++;
    }
}

int main(){
    std::vector<T> foo = {some, T, values};
    myFunky(foo, foo.begin(), foo.end())
    return 0;
}

คนนี้จะนำไปสู่ๆหรือมันสิ้นสุดหลังจาก foo.size() การทำซ้ำ? ในคำอื่นคือคนที่ last iterator ถูกปรับปรุงเป็น foo เติบโตขึ้นหรือต้องจ้าค่าที่ให้ในฟังก์ชันโทรหา?

ฉันคิดว่า last จะเปลี่ยนแปลงตั้งแต่มันเป็น pointer ต้องเป็นตำแหน่งแต่ต้องการคำสั่งยืนยัน

c++ controls flow iterator
2021-11-18 16:56:38
1

คำตอบที่ดีที่สุด

0

คนนี้จะนำไปสู่ๆหรือมันสิ้นสุดหลังจาก foo.size() การทำซ้ำ?

ก็เหมือนกัน สิ่งที่คุณทำอยู่มัน ยังไม่ระบุพฤติกรรมสำหรับสองสามเหตุผล:

  • เธอปรุงภาพลักษณ์ที่สมบูรณ์ vector ในขณะที่ iterating ผ่านมันไปได้

    ถ้าเว็กเตอ reallocates งภายในห้องเก็บขอตอนที่ผลักไสคนใหม่รายการทั้งที่มีอยู่ iterators ไป vector เป็น invalidatedรวมถึงทั้งสอง iterators คุณใช้วงด้วย แต่ถึงแม้ผลักไสคนใหม่เสมองรายการ invalidates ง end() iterator อย่างน้อยนะ

    เห็น Iterator invalidation กฎสำหรับภาษา C++language containers

  • คุณเป็น dereferencing ง end() iterator ซึ่งไม่เคยเอ่ยถึงเพื่อที่ถูกต้ององค์

ฉันคิดว่า last จะเปลี่ยนแปลงตั้งแต่มันเป็น pointer ต้องเป็นตำแหน่ง

มันไม่สามารถเปลี่ยนแปลงตั้งแต่คุณผ่านมันไป myFunc ฟังก์ชันโดยค่าดังนั้นมันเป็น สำเนา ของต้นฉบับ end() iterator. ถ้า end() เปลี่ยนแปลงค่า, last จะไม่ยอมเปลี่ยนค่าตั้งแต่มันเป็น คัดลอก.

,จะกรณีใดก็ตาม,iterators ไม่จำเป็นหรอกติดตั้งเพื่อใช้งานเป็นชี้ประเด็นแต่ชี้ประเด็นคือที่ถูกต้อ iterators. แต่มันไม่สำคัญในคดีนี้ ถึงแม้ว่า vector::iterator แค่ง่ายๆ pointer, last คงยังได้ invalidated นจากทุกดัน/reallocation.

2021-11-18 21:20:33

ผ่านไปด้วยค่าเป็น deliberate-ความคิดนี้ควรที่ต้อง พยายาม จะทำให้คนเว็กเตอ iterate อยู่ในปัจจุบันเป็นค่าในขณะที่ appending ใหม่ตอนที่ทุกอย่างจะจบลง สมเหตุสมผลฉันได้รับความทรงจำเข้าถึงความรุนแรงที่หนีไปกับผู้ชายคนหนึ่ง ขอบคุณสำหรับ invalidation กฎของปลั๊กออก(ฉันรู้ว่าสิ่งที่ฉันกำลังมองหาถูกบันทึแต่ไม่รู้ว่าต้องทำยังไง verbalize มัน). และขอบคุณสำหรับคำตอบเพื่อน จริงเคลียร์เรื่องขึ้นมา เชียร์ส!
Pedro Barbeira

ฉันจะแนะนำให้ caching คนแทรท้องถิ่นเว็กเตอและจากนั้นก็เพิ่มเข้าไปนั้นกับจุดจบของเป้าหมายเว็กเตอร์หลังจากที่ทำซ้ำเสร็จแล้ว
Remy Lebeau

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่