Hiện nay tôi đang tạo ra một bộ mới như thế này:Có cách nào nhanh chóng để tạo bộ không?
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
Có cách nào để tạo ra s
trong một dòng?
Hiện nay tôi đang tạo ra một bộ mới như thế này:Có cách nào nhanh chóng để tạo bộ không?
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
Có cách nào để tạo ra s
trong một dòng?
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);
Bạn có thể muốn có một cái nhìn tại Boost.Assign:
http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html
đó là cách sử dụng tốt nhất toán tử dấu phẩy quá tải: +1 – Chubsdad
int myints[]= {10,20,30,40,50};
std::set<int> mySet(myints, myints + 5);
Ok, phải thừa nhận hai dòng :)
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
@Sbi, cảm ơn vì liên kết đó, rất hữu ích! –
Nếu nó có sẵn, sau đó tôi thích '... mySet (myints, myints + _countof (myints)) ...' –
Đâ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);
+1, điều đó khá gọn gàng. –
@ Moo-Juice - vâng, nhưng được lấy cảm hứng từ phiên bản gốc của bạn. –
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.
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
@Claudiu: Tôi không hiểu ý bạn là gì, tôi sợ. –
Tôi có nghĩa là bạn chỉ có thể làm 'std :: set
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ó bạn có thể! :) (Bạn đánh bại tôi bằng 5 giây ...) –
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? –
@Amir: Có, trên cả hai tính. –