2012-07-30 25 views
5

Nhóm chúng tôi chỉ chạy vào cùng một vấn đề được mô tả ở đây http://forums.codeguru.com/archive/index.php/t-514404.html, tức là gọi some_vec.resize(new_size), nơi N = new_size - some_vec.size() với N> = 2, và VC10 mặc định-xây dựng tất cả các yếu tố mới N, trong khi GCC mặc định xây dựng một yếu tố duy nhất, như yếu tố nguyên mẫu , để sao chép-xây dựng nó N lần cho các yếu tố mới.Bao nhiêu lần std :: vector :: resize nên mặc định-xây dựng các yếu tố mới?

Vì đây là một vectơ uuid, trong đó hàm khởi tạo mặc định khởi tạo ngẫu nhiên mỗi thể hiện mới, chúng tôi kết thúc bằng N lần cùng uuid với GCC và N uuids khác nhau với VC. Đó là đủ để tàn phá trong bộ thử nghiệm của chúng tôi trên một nền tảng nhưng không phải là nền tảng khác, và không có gì thú vị để tìm thấy.

Câu hỏi của tôi là: ai đúng? VC hoặc GCC? Hay đây là một trong những góc yêu thích của C++ không được chỉ định? TIA, --DD

+1

Tiêu chuẩn đã thay đổi. Dưới đây là một câu hỏi tương tự [std :: vector, xây dựng mặc định, C++ 11 và thay đổi phá vỡ] (http://stackoverflow.com/questions/5759232/stdvector-default-construction-c11-and-breaking-changes) –

+0

Cần lưu ý rằng lớp học của bạn hơi "kỳ lạ": Về cơ bản, bạn có tình huống với 'T x; T y; 'bạn có' x! = Y'. Điều này đảm bảo rất nhiều sự chăm sóc, và tài liệu rõ ràng ... –

+0

Ngẫu nhiên về xây dựng là một điều xấu, bạn có thể nhìn thấy nó trong ví dụ của bạn. Hầu hết mã giả định rằng tất cả các đối tượng được xây dựng mặc định đều bằng nhau. Để giải quyết những vấn đề này, bạn cần có một hàm ngẫu nhiên. Hoặc một nhà máy tạo ra các đối tượng ngẫu nhiên. – Dani

Trả lời

6

Tôi đặt cược nếu bạn biên dịch GCC với -std=c++0x, bạn sẽ nhận được kết quả tương tự như với MSVC, đó là, các cấu trúc mặc định của N. Điều này đã thay đổi trong C++ 11, xem here. Hiện nay có hai quá tải, một với chỉ kích thước mới mà mặc định xây dựng các phần tử mới và một tham số khác có tham số "nguyên mẫu" để sao chép-xây dựng mọi phần tử mới từ đó.

Bây giờ, để có được kết quả phù hợp cho dù chế độ nào bạn biên dịch trong, chỉ cần sử dụng

v.resize(new_size, T()); 

thông tin Bối cảnh: Sự thay đổi là cần thiết, kể từ bây giờ có nhiều loại có thể được di chuyển, nhưng không copyable (như std::unique_ptr). Chữ ký cũ yêu cầu có thể sao chép được. Bây giờ tham số mẫu đầu tiên cho các loại vùng chứa tiêu chuẩn chỉ bắt buộc phải có thể sao chép được, nếu bạn sử dụng các hoạt động yêu cầu bản sao.

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