Nếu nó thậm chí tồn tại, điều gì sẽ std::map
danh sách trình khởi tạo mở rộng trông như thế nào?
Tôi đã thử một số kết hợp ... tốt, mọi thứ tôi có thể nghĩ ra với GCC 4.4, nhưng không tìm thấy gì được biên dịch.
Câu trả lời:
Nó tồn tại và hoạt động tốt:
std::map <int, std::string> x
{
std::make_pair (42, "foo"),
std::make_pair (3, "bar")
};
Hãy nhớ rằng loại giá trị của bản đồ là pair <const key_type, mapped_type>
vậy, vì vậy về cơ bản bạn cần một danh sách các cặp có cùng loại hoặc có thể chuyển đổi.
Với việc khởi tạo hợp nhất với std :: pair, mã trở nên đơn giản hơn
std::map <int, std::string> x {
{ 42, "foo" },
{ 3, "bar" }
};
map( std::initializer_list<value_type> init, const Compare& comp = Compare(), const Allocator& alloc = Allocator() );
nó có sẵn kể từ C ++ 11 và map( std::initializer_list<value_type> init, const Allocator& );
chỉ khả dụng từ C ++ 14 . Tham khảo: std :: map
Tôi muốn thêm vào câu trả lời của doublep rằng việc khởi tạo danh sách cũng hoạt động cho các bản đồ lồng nhau. Ví dụ: nếu bạn có một std::map
với std::map
các giá trị, thì bạn có thể khởi tạo nó theo cách sau (chỉ cần đảm bảo rằng bạn không bị chìm trong dấu ngoặc nhọn):
int main() {
std::map<int, std::map<std::string, double>> myMap{
{1, {{"a", 1.0}, {"b", 2.0}}}, {3, {{"c", 3.0}, {"d", 4.0}, {"e", 5.0}}}
};
// C++17: Range-based for loops with structured binding.
for (auto const &[k1, v1] : myMap) {
std::cout << k1 << " =>";
for (auto const &[k2, v2] : v1)
std::cout << " " << k2 << "->" << v2;
std::cout << std::endl;
}
return 0;
}
Đầu ra:
1 => a-> 1 b-> 2
3 => c-> 3 d-> 4 e-> 5