2015-10-12 13 views
22

Tôi có một chương trình C++ mà tôi muốn chèn các giá trị mặc định cho bất kỳ phím nào bị thiếu trong một số std::map. Tôi nghĩ cách dễ nhất để làm điều này là sử dụng std::map::operator[]() như lệnh cảm ứng POSIX - nghĩa là, để nguyên giá trị không thay đổi nếu nó đã tồn tại, nhưng để tạo nó nếu không. Đối với example,Tôi có thể dựa vào std :: map :: operator [] để liên lạc không?

#include <map> 
#include <vector> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    vector<int> keys = {0, 1}; 

    map<int, int> m; 
    m[1] = 5; 
    m[2] = 12; 

    for (const int i : keys) 
    { 
     m[i]; // touch value 
    } 

    for (auto const & kv : m) 
    { 
     cout << kv.first << ", " << kv.second << endl; 
    } 
} 

Tôi có thể chắc chắn rằng trình biên dịch sẽ không tối ưu hóa ra m[i]; báo cáo, vì tôi không "làm" bất cứ điều gì với họ? (Không chỉ định rõ ràng, không đọc từ.)

Trả lời

17

Có bạn có thể chắc chắn. Tối ưu hóa cuộc gọi đi sẽ thay đổi hành vi quan sát được của chương trình của bạn và trình biên dịch không được phép thực hiện điều này (ngoại trừ trong trường hợp RVO).

Điều này được gọi là as-if rule.

+0

Bạn có thể trích dẫn nguồn không? –

+0

@ cp.engr Xem chỉnh sửa. –

+0

Cảm ơn. Tôi có thể đề xuất trích dẫn bit này trong câu trả lời của bạn không? "một thực hiện thực tế không cần đánh giá một phần của một biểu thức nếu nó có thể suy ra rằng giá trị của nó không được sử dụng và không có tác dụng phụ nào ảnh hưởng đến hành vi quan sát được của chương trình được tạo ra". Từ blockquote thứ hai trong câu trả lời được chấp nhận mà bạn đã liên kết. –

5

Toán tử [] thực sự mặc định xây dựng giá trị sẽ nằm ở vị trí của khóa đó nếu bạn không gán cho nó cái gì đó.

Reference Link

Nếu k không phù hợp với chủ chốt của bất kỳ yếu tố trong các container, chức năng chèn một yếu tố mới với chìa khóa đó và trả về một tham chiếu giá trị ánh xạ của nó. Lưu ý rằng điều này luôn làm tăng kích thước vùng chứa , ngay cả khi không có giá trị được ánh xạ nào được gán cho phần tử (phần tử được tạo bằng cách sử dụng hàm tạo mặc định của nó).

6

Có, bạn có thể chắc chắn. Đó là lẽ trực quan hơn khi bạn xem xét rằng dòng trong câu hỏi là tương đương với điều này:

m.operator[](i); 

& hellip; và bạn không mong đợi chức năng tùy ý gọi được tối ưu hóa ra khỏi chương trình của bạn, nếu họ làm bất cứ điều gì.

Các vấn đề liên quan