2010-11-16 48 views

Trả lời

7

Bạn có thể nhìn vào Boost.Assign, cho phép bạn để viết những thứ như:

const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11); 
+1

Có bạn có thể! :) (Bạn đánh bại tôi bằng 5 giây ...) –

+0

Tính năng này có hoạt động không? Nó có hoạt động với các loại khác nhau không? –

+0

@Amir: Có, trên cả hai tính. –

16
int myints[]= {10,20,30,40,50}; 
std::set<int> mySet(myints, myints + 5); 

Ok, phải thừa nhận hai dòng :)

+0

Tốt, '+ 1' từ tôi. Điều đó thậm chí còn dễ dàng hơn với [những] này (http://stackoverflow.com/questions/2552839/which-c-standard-library-wrapper-functions-do-you-use/2553081#2553081). – sbi

+0

@Sbi, cảm ơn vì liên kết đó, rất hữu ích! –

+1

Nếu nó có sẵn, sau đó tôi thích '... mySet (myints, myints + _countof (myints)) ...' –

3

Đây là một C++ 0x alt ernative để trả lời Moo-Juice cho trường hợp xây dựng A là đắt hơn cho int.

int myints[]= {10,20,30,40,50}; 
size_t total(sizeof(myints)/sizeof(int)); 

auto begin(std::make_move_iterator(myints)); 
auto end(std::make_move_iterator(myints + total)); 

std::set<int> mySet(begin, end); 
+0

+1, điều đó khá gọn gàng. –

+0

@ Moo-Juice - vâng, nhưng được lấy cảm hứng từ phiên bản gốc của bạn. –

4

Trong C++ 0x tiêu chuẩn xác định Initializer List là một cải tiến cho loại cấu trúc (khó xử) này.

Nó dễ dàng hơn bây giờ:

std::set<int> set = {10, 20, 30, 40, 50}; 

Tất cả phải mất là cho thư viện tiêu chuẩn để khai báo constructor sau đây để thiết lập:

template <typename Value, typename Compare, typename Allocator> 
set<Value, Compare, Allocator>::set(std::initializer_list<Value> list); 

và tất cả những lo lắng của chúng tôi đã gọn gàng vuốt qua.

+0

Lưu ý rằng ngày nay, với C++ 11, bạn thậm chí không cần khai báo hàm tạo đó. – Claudiu

+0

@Claudiu: Tôi không hiểu ý bạn là gì, tôi sợ. –

+0

Tôi có nghĩa là bạn chỉ có thể làm 'std :: set set = {10, 20, 30, 40, 50};' trong mã của bạn mà không cần phải bao gồm 'template set :: set (std :: initializer_list list); '. [Ideone ví dụ ở đây] (https://ideone.com/wlWCMl). – Claudiu

4

Nếu dữ liệu ban đầu của bạn nằm trong một số vùng chứa std::some_container<A> a; đã bắt đầu và kết thúc vòng lặp, và đây là các trình vòng lặp chuyển tiếp hoặc tốt nhất (chúng chỉ cần có toán tử nạp chồng quá tải) thì bạn có thể tạo bộ mới theo cách này.

std::set<A> s(a.begin(), a.end()); 
Các vấn đề liên quan