cuốn sách gpt4 ai đã làm

c++ - Chèn các thành viên vectơ vào vectơ trong quá trình mở rộng: vector.push_back(vector[0])

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 18:28:47 29 4
mua khóa gpt4 Nike

Tôi đang viết một lớp vectơ tùy chỉnh trong C++. Tôi gặp vấn đề với mã như thế này:

    vectorvec;
vec.push_back(một);
vec.push_back(hai);
vec.push_back(vec[0]);

push_back được định nghĩa như sau:

    void push_back(const T & v)

Tránh sự trùng lặp không cần thiết. Việc thực hiện nó trông giống như

    nếu (kích thước == dung lượng)
{
phân bổ lưu trữ mới
sao chép các giá trị cũ vào bộ lưu trữ mới
// 2
xóa bộ nhớ cũ
sửa con trỏ và bộ đếm
}
// 1
sao chép v ở cuối bộ nhớ

Vấn đề nảy sinh nếu chúng ta muốn đẩy các phần tử đã có trong vectơ và vectơ cần được mở rộng (kích thước bằng dung lượng của nó). Nếu chúng ta làm (vec.push_back(vec[0])) thì vào //1 , nó đã được phát hành. Vì vậy chúng ta cần một bản sao của nó. Một lựa chọn khác là thêm nó vào //2 ở đâu đó nhưng trông không đẹp lắm.

Bạn sẽ giải quyết vấn đề này như thế nào?

câu trả lời hay nhất

Trong một số triển khai STL mà tôi đã thấy (chẳng hạn như VS2010 hiện tại), trước tiên họ kiểm tra xem con trỏ tới mục dữ liệu mới đang được thêm có nằm trong phạm vi hiện tại của bộ đệm vectơ hay không.

Nếu vậy, hãy tìm vị trí chỉ mục (không phải con trỏ!) của vị trí dữ liệu trong vectơ. Điều này không thay đổi ngay cả khi bộ đệm cơ bản được phân bổ lại. Khi bộ đệm được mở rộng (có liên quan đến việc phân bổ lại thực tế hay không), mục dữ liệu có thể được sao chép một cách an toàn từ vị trí chỉ mục.

Một tùy chọn khác mà tôi nghĩ bạn đã đề cập là lấy một bản sao (ngăn xếp) cục bộ của mục dữ liệu sẽ được thêm vào trước khi phân bổ lại bộ đệm, trong trường hợp mục đó nằm trong vectơ. Rõ ràng, nếu kiểu dữ liệu rất tốn kém để sao chép (có thể giống như một vectơ khác??), thì đây có thể không phải là một ý tưởng hay.

Hy vọng điều này sẽ giúp.

Về c++ - chèn các thành viên vectơ vào vectơ trong quá trình mở rộng: vector.push_back(vector[0]), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/5920456/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress