Nếu bạn đang hỏi làm thế nào để khởi tạo một vectơ const để nó có nội dung thú vị, thì câu trả lời có thể là sử dụng hàm tạo bản sao. Đầu tiên, bạn điền một cách chăm chỉ vào một vectơ, sau đó bạn tạo vectơ const mới từ nó. Hoặc bạn có thể sử dụng vector<InputIterator>(InputIterator, InputIterator)
mẫu phương thức khởi tạo để khởi tạo từ một số loại vùng chứa hoặc mảng khác. Nếu một mảng, thì mảng đó có thể đã được xác định bằng danh sách khởi tạo.
Một cái gì đó như thế này hy vọng gần với những gì bạn muốn:
const T ra[3] = {t1, t2, t3};
const vector<const T> v(ra, ra+3);
Nếu bạn đang hỏi làm thế nào để truyền một vectơ const vào một hàm nhận một vectơ thì câu trả lời là:
- bạn không thể, vì hàm có thể thay đổi vectơ và đối tượng / tham chiếu của bạn là const. Tạo một bản sao không phải const của bản gốc và chuyển nó vào.
hoặc là
- sử dụng
const_cast
để loại bỏ hằng số để chuyển nó vào một hàm nhận một vectơ không phải const nhưng mà bạn tình cờ biết sẽ không sửa đổi vectơ.
Cái thứ hai là một trong những thứ, hoàn toàn đúng, khiến bất cứ ai nhìn thấy nó sẽ đưa ra nhận xét về kính bảo hộ và thực tế là họ không làm gì cả. Nó chính xác const_cast
là để làm gì , nhưng có một lập luận hợp lý mạnh mẽ nói rằng nếu bạn cần const_cast
, bạn đã thua.
Thực hiện cả hai điều đó (tạo một vectơ const từ một vectơ không phải const bằng hàm tạo bản sao, và sau đó loại bỏ hằng số) chắc chắn là sai - bạn nên sử dụng một vectơ không phải const. Vì vậy, hãy chọn nhiều nhất một trong số này để làm ...
[ Chỉnh sửa: chỉ nhận thấy rằng bạn đang nói về sự khác biệt giữa vector<T>
và const vector<const T>
. Thật không may trong STL, vector<const T>
và vector<T>
là các loại hoàn toàn không liên quan, và cách duy nhất để chuyển đổi giữa chúng là bằng cách sao chép. Đây là sự khác biệt giữa vectơ và mảng - a T**
có thể được chuyển đổi âm thầm và an toàn thành const T *const *
]