2009-05-25 40 views
65

Tôi đoán đây là một câu hỏi đơn giản. Tôi cần phải làm một cái gì đó như thế này:std :: back_inserter cho std :: set?

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); 

Tất nhiên, std::back_inserter không hoạt động vì không có push_back. std::inserter cũng cần trình lặp? Tôi đã không sử dụng std::inserter vì vậy tôi không chắc chắn phải làm gì.

Có ai có ý tưởng không?


Tất nhiên, tùy chọn khác của tôi là sử dụng vectơ cho s2 và sau đó sắp xếp lại sau. Có lẽ đó là tốt hơn?

Trả lời

98

set không có push_back vì vị trí của phần tử được xác định bởi bộ so sánh của tập hợp. Sử dụng std::inserter và vượt qua nó .begin():

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
transform(s1.begin(), s1.end(), 
      std::inserter(s2, s2.begin()), ExcitingUnaryFunctor()); 

Các iterator chèn sau đó sẽ gọi s2.insert(s2.begin(), x) nơi x là giá trị truyền cho iterator khi ghi vào nó. Các thiết lập sử dụng iterator như là một gợi ý nơi để chèn. Bạn cũng có thể sử dụng s2.end().

+0

Hoạt động cho std :: bản đồ cũng như (bạn đã tiết kiệm thời gian của tôi, cảm ơn bạn). – FreeNickname

+1

Vì 'inserter (vec, vec.end())' cũng hoạt động cho các vectơ, tại sao có ai sử dụng back_inserter ngay từ đầu? – NHDaly

+5

@NHDaly: vì back_inserter nhanh hơn – marton78

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