Cách khởi tạo vectơ C ++ 17 của các cặp với phần tử tùy chọn


34

Trong C ++ 17, làm thế nào để bạn khai báo và khởi tạo một vectơ các cặp (hoặc bộ dữ liệu) với một phần tử tùy chọn?

    std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
                                                           {2, false}, 
                                                           {3, nullptr}};

Tôi có một cặp trong đó phần tử thứ hai có thể là null / tùy chọn.


1
std::piecewise_constructcũng có thể cung cấp các lựa chọn thay thế thú vị.
Marc Glisse

4
Điều này có trả lời câu hỏi của bạn không? Làm cách nào để gán "không có gì" cho std :: tùy chọn <T>?
Julien Lopez

@JulienLopez Đó là nói về sự phân công.
LF

@LF Đó là câu hỏi tương tự khi bạn loại bỏ bối cảnh không liên quan: làm thế nào để bạn tạo một tùy chọn trống?
Julien Lopez

1
@JulienLopez Trong C ++, việc khởi tạo và gán rất khác nhau nói chung. Chỉ vì hai câu hỏi xảy ra có các giải pháp chồng chéo không có nghĩa là chúng giống nhau. Đặc biệt, lưu ý rằng bạn không muốn sử dụng resetở đây.
LF

Câu trả lời:


49

Bạn đang tìm kiếm std::nulloptthay vì nullptr.

std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };

3
(Đến đây từ liên kết câu hỏi mạng nóng) Mã C ++ có luôn spam std::như thế này không? Tại sao không chỉ using std::vectorvà bạn bè, vì vậy bạn chỉ có thể viết vector<pair<int, optional<bool>>? Đọc một cách tỉnh táo hơn
Alexander - Tái lập Monica

17
@ Alexander-ReinstateMonica "Đọc cách an toàn hơn" là chủ quan. Mặt trái của các đối số có thể đọc là một cái gì đó như thế này: Tôi không muốn phải đi tất cả các cách trở lại phía trên cùng của tập tin vào con số ra mà nói riêng vector , pair, optional, vv Tôi đang sử dụng trong dòng này. Bao gồm không gian tên nội tuyến cho tôi biết rõ ràng chức năng đó đến từ đâu và nó làm gì; dòng là khép kín. Điều này đặc biệt đúng đối với các dự án lớn hơn (vì nó tránh hoàn toàn xung đột không gian tên), nhưng cũng hữu ích cho các ví dụ mã ngắn gọn.

3
@ Alexander-ReinstateMonica Logic đó là tốt nếu bạn có toàn quyền giám sát và kiểm soát bất kỳ mã nào sử dụng mã bạn vừa viết (bởi vì sau đó bạn biết chính xác khi xảy ra "trường hợp xảy ra va chạm"). Nhưng nếu bạn đang làm một cái gì đó như, ví dụ, phát triển thư viện hoặc API dành cho các nhà phát triển khác sử dụng, bạn không thể giám sát mọi cách sử dụng để tìm hiểu xem / khi xảy ra xung đột như vậy. Nó thường tốt hơn trong trường hợp đó (tương đối phổ biến) đối với các va chạm trước, thay vì chỉ khắc phục chúng sau khi ai đó phàn nàn rằng sản phẩm của bạn bị hỏng.

3
@ Alexander-ReinstateMonica Điều nào sau đây bạn nhận ra ngay lập tức là một tên cấp cao nhất từ stdđâu? arg, count, find,size
LF

4
@ Alexander-ReinstateMonica, với tôi, std::hoàn toàn không gây chú ý. Sẽ khác nếu tên của không gian tên dài hơn nhiều.
Carsten S

24

Hoặc đơn giản sử dụng xây dựng mặc định:

std::vector<std::pair<int, std::optional<bool>>> vec1 {
    {1, true}, {2,false}, {3,{}}
};

6
Trong khi điều này hoạt động, std::nullopttốt hơn truyền đạt ý định.
Williham Totland
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.