Khi sử dụng vùng chứa C++ STL, trong điều kiện nào phải tham chiếu giá trị được truy cập? Ví dụ: có bất kỳ tham chiếu nào bị vô hiệu sau khi cuộc gọi hàm tiếp theo tới vùng chứa không?Tài liệu tham khảo liên tục trong Vùng chứa STL
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
vector.push_back (3);
vector[0] = 10; //modifies 0'th element
int& ref = vector[0];
ref = 10; //modifies 0'th element
vector.push_back (4);
ref = 20; //modifies 0'th element???
vector.clear();
ref = 30; //clearly obsurd
}
Tôi hiểu rằng trong hầu hết các triển khai của stl, điều này sẽ hiệu quả, nhưng tôi quan tâm đến những tuyên bố tiêu chuẩn yêu cầu. Im --edit: Im quan tâm vì tôi muốn thử thư viện STXXL (http://stxxl.sourceforge.net/) cho C++, nhưng tôi nhận ra rằng các tham chiếu được trả về bởi các thùng chứa không liên tục qua nhiều lần đọc, và do đó không tương thích mà không thực hiện thay đổi (Tuy nhiên bề ngoài) với mã stl hiện tại của tôi. Một ví dụ:
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
int& refA = vector[0];
int& refB = vector[1]; //refA is not gaurenteed to be valid anymore
}
Tôi chỉ muốn biết nếu điều này có nghĩa là container STXXL nơi tương thích không phải là 100%, hoặc thực sự nếu tôi đã sử dụng STL container một cách phụ thuộc không an toàn/thực hiện trong suốt thời gian.
Tôi tìm thấy câu trả lời có liên quan về Câu hỏi thường gặp của họ http://algo2.iti.uni-karlsruhe.de/dementiev/stxxl/trunk/FAQ.html "Bạn không được chuyển hoặc lưu trữ tham chiếu đến các phần tử trong cấu trúc dữ liệu bộ nhớ ngoài Khi tham chiếu được sử dụng, khối chứa phần tử có thể không còn trong bộ nhớ trong. ", Vì vậy câu trả lời là KHÔNG, tham chiếu đến các phần tử vùng chứa để không có hành vi giống như các đối tác STL của chúng. – Akusete
Nhìn qua tiêu chuẩn C++, tất cả các thùng chứa có tham số 'tham số',' const_reference', 'pointer' và' const_pointer' được đặt thành typedefs tương ứng từ trình cấp phát cơ bản. Dường như ủy ban tiêu chuẩn ban đầu muốn thiết lập một trừu tượng cho các ref và con trỏ sao cho ngay cả những thứ này có thể được "quản lý" bởi một container (theo cách mà các trình vòng lặp đã có) bằng proxy, nhưng dừng lại một phần - tiêu chuẩn bắt buộc rằng các loại 'cấp phát :: con trỏ' được' T * 'vv, làm cho typedefs mình cuối cùng vô nghĩa tôi nghĩ. –
Tôi có cảm giác tương tự bằng cách đọc qua các giao diện của hầu hết các container STL, nhưng tôi không thể tìm thấy một cuộc thảo luận về lý do tại sao họ chỉ đi một nửa. – Akusete