2010-10-10 27 views
11

Bản sao có thể xảy ra:
Vector.erase(Iterator) causes bad memory access
iterate vector, remove certain items as I go.xóa trong khi lặp

Hi, tôi đã viết này nhưng tôi nhận được một số lỗi khi chạy nó

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) { 
     if (track->empty()) { // if track is empty, remove it 
      tracks_.erase(track); 
      track++; // is this ok? 
     }else { //if there are points, deque 
      track->erase(track->begin()); //my program crashes here after a while... ;(
     } 
    } 

tôi có một vectơ vecto r của các điểm (2 ints) mà tôi gọi bài hát (1 rãnh là 1 vectơ điểm) Tôi muốn kiểm tra từng bản nhạc và nếu chúng chứa các điểm thì hãy xóa bản nhạc đầu tiên nếu không xóa bản nhạc đó. Điều này có đúng không?

Xin cảm ơn trước.

+0

gì lỗi bạn đang nhận được? –

+0

Loại câu hỏi này đã được hỏi nhiều lần. Kết quả đầu tiên của việc tìm kiếm "C++ erase iterator" là http://stackoverflow.com/questions/2943912/vector-eraseiterator-causes-bad-memory-access cũng trả lời câu hỏi này. – TheUndeadFish

+0

@ nacho4d: Không liên quan trực tiếp, nhưng hãy xem Boost MultiArray cho cấu trúc hai chiều. Nó có phần dễ sử dụng hơn kiểu 'std :: vector >'. – lunaryorn

Trả lời

33

erase() của một véc tơ làm mất hiệu lực các trình vòng lặp hiện có, nhưng returns trình lặp mới trỏ đến phần tử sau phần tử đã bị xóa. Trình lặp này có thể được sử dụng để tiếp tục lặp qua vectơ.

vòng lặp của bạn có thể được viết như thế này:

vector< vector<Point> >::iterator track = tracks_.begin(); 
while (track != tracks_.end()) { 
    if (track->empty()) { 
     // if track is empty, remove it 
     track = tracks_.erase(track); 
    } 
    else { 
     //if there are points, deque 
     track->erase(track->begin()); 
     ++track; 
    } 
} 
+0

Tuyệt vời. Mạnh mẽ, đơn giản, không yêu cầu làm đại biểu của riêng tôi, v.v. – Eliot

+0

Đây là một mẫu đủ phổ biến mà sẽ rất tuyệt khi thấy thứ gì đó như thế này xuất hiện trong tiêu chuẩn. – jbruni

+0

Xóa "deque" thứ hai là gì? Trình theo dõi "vòng lặp" thậm chí không có phương pháp xóa/bắt đầu? Không thể biên dịch nó và hoạt động tốt mà không cần. – lama12345

Các vấn đề liên quan