2012-04-27 78 views
14

Tôi tất cả các bạn,Cách lấy phần tử đầu tiên của tiêu chuẩn :: set

Tôi đã tìm thấy một lỗi lạ trong phần mềm của mình.

Bên trong một vòng lặp while nơi tôi loại bỏ các yếu tố từ một std :: set, tôi muốn luôn để có những yếu tố đầu tiên cho đến khi container rỗng:

std::set< int*> nodes; 
// Fill nodes 
for (int i=0; i<10;i++) 
    nodes.insert(new int); 
// 
while (!nodes.empty()) 
{ 
int* pivot = (*nodes.begin()); 
// do some operation with pivot erasing some elements from nodes 
} 

tôi thấy rằng việc thực hiện các yếu tố đầu tiên theo cách này công trình với gcc nhưng không phải với MSVC, nó bị treo ở nơi tôi cố gắng dereference bộ lặp vòng (*nodes.begin()).

Thực hiện hai lệnh std :: set có hoạt động khác không?

Tôi muốn có cấu trúc dữ liệu không có sự khác biệt về triển khai, có thể không?

Có lẽ tôi phải thay đổi cấu trúc dữ liệu cho các loại hình hoạt động

+0

gì sẽ xảy ra sau khi dereference của bạn? – Nick

+5

Điều gì là "thực hiện một số thao tác với trục xóa một số phần tử khỏi các nút" –

+4

chỉ cần dereference như thế này * (nodes.begin()) – v01d

Trả lời

2

việc mã của bạn tốt trong VS2010, mybe bạn nên cập nhật VCC của bạn.

-3

Bạn không thể sử dụng trình lặp trên một tập hợp như thế này khi xóa phần tử khỏi tập hợp sẽ làm mất hiệu lực trình lặp. Khi kích thước của tập hợp nằm dưới một ngưỡng nhất định (dựa trên kích thước ban đầu khi bạn thiết lập trình vòng lặp), nó sẽ sửa đổi lưu trữ dữ liệu cơ bản của bạn trên heap, điều này sẽ khiến con trỏ của bạn trỏ tới crap.

Xem dưới giá trị iterator: http://www.cplusplus.com/reference/set/set/erase/

(* nodes.begin()) không những gì bạn muốn, bạn chỉ có thể không xóa từ một thiết iterating của bạn thông qua

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