Tôi đang cố gắng chèn bản sao của phần tử hiện tại vector
để tăng gấp đôi. Các mã sau đây làm việc trong các phiên bản trước đó nhưng thất bại trong Visual Studio 2010.Làm cách nào để chèn phần tử trùng lặp vào vectơ?
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> test;
test.push_back(1);
test.push_back(2);
test.insert(test.begin(), test[0]);
cout << test[0] << " " << test[1] << " " << test[2] << endl;
return 0;
}
Output là -17891602 1 2
, dự kiến 1 1 2
.
Tôi đã tìm ra lý do tại sao nó xảy ra - vectơ đang được phân bổ lại và tham chiếu trở nên không hợp lệ trước khi được sao chép vào điểm chèn. Visual Studio cũ dường như đã làm mọi thứ theo thứ tự khác nhau, do đó chứng minh rằng một kết quả có thể có của hành vi không xác định là hoạt động chính xác và cũng chứng minh rằng nó không bao giờ là thứ bạn nên dựa vào.
Tôi đã đưa ra hai cách khác nhau để khắc phục sự cố này. Một là sử dụng reserve
để đảm bảo rằng không có phân bổ lại diễn ra:
test.reserve(test.size() + 1);
test.insert(test.begin(), test[0]);
khác là tạo một bản sao từ tài liệu tham khảo để không có sự phụ thuộc vào các tài liệu tham khảo còn lại có giá trị:
template<typename T>
T make_copy(const T & original)
{
return original;
}
test.insert(test.begin(), make_copy(test[0]));
Mặc dù cả hai công việc, không ai cảm thấy giống như một giải pháp tự nhiên. Có cái gì tôi đang mất tích?
Xem trước bản xem trước BTW vc11 cho '1 1 2' cho ví dụ đầu tiên. –
@Jesse, điều đó không làm tôi ngạc nhiên. Quá tải Rvalue của 'chèn' đã được chọn, có vẻ như một lỗi mà họ có thể đã sửa. Mã này hoàn toàn khác nhau giữa quá tải đó và mã mất tham chiếu const. –
Không truyền tới công việc? –