Danh sách trình khởi tạo mở rộng std :: map sẽ trông như thế nào?


90

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:


145

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" } 
};

3
Tuyệt vời, điều này làm cho nó rất đẹp. Tôi có thể chỉ cần "bỏ" hỗ trợ cho MSVC 2010 để có thể sử dụng điều này với GCC :).
rubenvb

1
Đảm bảo rằng trình biên dịch của bạn hỗ trợ Modern C ++ , vì map( std::initializer_list<value_type> init, const Compare& comp = Compare(), const Allocator& alloc = Allocator() );nó có sẵn kể từ C ++ 11map( std::initializer_list<value_type> init, const Allocator& );chỉ khả dụng từ C ++ 14 . Tham khảo: std :: map
KaiserKatze

2

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::mapvới std::mapcá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

Mã trên Coliru

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.