Tôi đang nghiên cứu việc sử dụng nhiều std::vector
tối ưu hóa giai đoạn cuối của thuật toán Một trong những tối ưu hóa của tôi liên quan đến việc phân lớp foo trong một số trường hợp, điều đó có nghĩa là vectơ
sẽ bao gồm cả hai foo
của vàfoo_subclass
của.
foo
chỉ mộtchar*
và một int
, Và foo_subclass
Thêm vào std::chuỗi
.Theo tôi hiểu, mỗi cái trong số chúng chiếm một vị trí có chiều rộng cố định trong vectơ (với một con trỏ tới foo_subclass
con trỏ tới một chuỗi), nhưng làm cách nào để phân bổ trong vùng chứa khi chúng được trộn lẫn?
Câu trả lời ngắn gọn là "bạn không thể làm điều đó". std::vector
không thể chứa foo_subclass
: Nếu bạn cố gắng đặt foo_subclass
Đi vàovectơ
, nó sẽ foo
lát cắtfoo_subclass
thành phần, tạo một bản sao và đặt nó vào foo
Đi vàovectơ
.
Câu trả lời dài hơn là có hai cách để giải quyết vấn đề này.
Đầu tiên, bạn có thể tạo một std::vector< std::unique_ptr >
-- một vectơ
Đã chỉ vào foo
con trỏ thông minh.~foo
Đúngảo
, sẽ rất thú vị khi làm việc cùng. Bạn mất dữ liệu liền kề. bạn phải hiểu duy nhất_ptr
, nhưng bạn nên biết duy nhất_ptr
Dẫu sao thì.
Thứ hai, bạn có thể tạo một std::vector< boost::variant< foo, foo_subclass > >
hoặc tương đương. Trong trường hợp này, cuối cùng cũng có đủ dung lượng lưu trữ cho foo
. hoặc foo_subclass
và tại thời điểm truy cập, người dùng phải xác định xem họ đang nhận được cái này hay cái kia. Về lý thuyết, bạn thậm chí có thể viết biến thể của riêng mình khác nhau
Bằng cách này, nó biết loại được lưu trữ có liên quan và bạn có thể làm điều đó như foo
truy cập, chỉ foo_subclass
các instance như là các lớp con của chúng.
Cách đầu tiên dễ dàng hơn nhiều, cách thứ hai là một kỹ thuật tiên tiến hơn và có lẽ không đáng để bạn phải bận tâm.
Tôi là một lập trình viên xuất sắc, rất giỏi!