2010-08-26 24 views
7

Tôi có một std :: map, và tôi muốn thêm một khóa hợp lệ để lặp lại nó sau này, nhưng không đưa ra bất kỳ giá trị nào (nó sẽ được đưa ra sau này trong quá trình lặp lại).Cách thêm khóa hợp lệ mà không chỉ định giá trị cho std :: map?

Đây là cách tôi làm điều đó cho bây giờ:

std::vector<std::string> valid_keys; 
//Fill... Then : 
std::map<std::string, float> map; 
for(size_t i = 0 ; i < valid_keys.size() ; ++i) { 
    /*I don't want to do that because in fact I don't use a float type*/ 
    map[valid_keys[i]] = 0.f; //<- 
} 
//Using : 
for(std::map<std::string, float>::iterator it = map.begin() ; it != map.end() ; ++it) { 
    it->second = 0; //Dummy 
} 

Làm thế nào tôi có thể làm điều đó, xin vui lòng?

Cảm ơn bạn.

+1

"/ * Tôi không muốn làm điều đó bởi vì trên thực tế tôi không sử dụng một loại float * /" nhưng bạn xác định 'std :: map ' tại sao xác định nó với một nổi nếu bạn không muốn nó lưu trữ nổi? –

+2

Nó làm cho nó thú vị hơn để cố gắng tìm ra những vấn đề thực sự là bằng cách làm xáo trộn nó với herrings đỏ. Nếu nó là quá dễ dàng thì bạn sẽ không đánh giá cao những bí ẩn. –

Trả lời

10

Tôi không hoàn toàn chắc chắn những gì bạn có ý nghĩa bởi "mà không đưa ra bất kỳ giá trị" nhưng nếu bạn có ý nghĩa mà không gán một cách rõ ràng giá trị sau đó chỉ cần làm

map[valid_keys[i]]; 

này vẫn hoạt động tức là nó tạo ra một mục mới trong bản đồ nếu trước đó chưa có một khóa đó. Các operator[] chỉ trả về một refernce đến giá trị để bạn có thể gán một giá trị mới cho nó nhưng hãy nhớ rằng nó là đã được xây dựng mặc định.

Nếu, mặt khác, bạn muốn nói rằng không có giá trị có ý nghĩa và có thể hoặc sau đó không nhận được giá trị hợp lệ, sau đó xem @UncleBens` answer.

+0

Tôi thậm chí không nghĩ về điều đó (xấu hổ với tôi), cảm ơn! @ Binary worrier: xin lỗi vì câu hỏi này, tôi nên được cải cách. –

+0

@Mister: 'map [key];' tương đương với 'map [key] = value_type();'. Trong ví dụ của bạn, đó sẽ là 'map [" key "] = float();'. Thay thế 'float' bằng bất kỳ kiểu nào khác (có một hàm tạo mặc định). – sbi

7

Tôi cho rằng điều gì đó có thể giúp bạn là Boost.Optional.

#include <boost/optional.hpp> 
#include <map> 

class CantConstructMe 
{ 
    CantConstructMe() {} 
}; 

int main() 
{ 
    std::map<int, boost::optional<CantConstructMe> > m; 
    m[0]; 
} 

Việc thiếu hàm tạo mặc định có sẵn không phải là vấn đề, theo mặc định optional sẽ trống.

+0

+1 - Tôi thực sự nghĩ rằng đây là những gì OP đang tìm kiếm. –

5

/* Tôi không muốn làm điều đó bởi vì trong thực tế, tôi không sử dụng một kiểu float */

Sau đó, thay vì sử dụng std::mapstd::set.

0

Dường như bạn thực sự muốn một tiêu đề :: set hoặc std :: danh sách các khóa và sau đó lặp lại tập hợp đó sau để tạo bản đồ của bạn. Nếu một số lý do không được chấp nhận, bạn có thể bọc phao của bạn với một số loại đối tượng thực hiện toán tử float() và các hàm chuyển đổi khác nhau cho float, nhưng cũng có cờ "good()" hoặc somesuch. .

Nếu giá trị cuối cùng của bạn thực sự nổi, bạn có thể khởi tạo giá trị thành +/- NaN làm trình giữ chỗ đơn giản.

Tôi muốn nói tăng :: tùy chọn là lựa chọn tốt hơn cho mã sản xuất, nhưng tùy thuộc vào yêu cầu của bạn.

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