目前我正在创建一个这样的新集:
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
有没有办法在一行中创建s
?
答案 0 :(得分:17)
int myints[]= {10,20,30,40,50};
std::set<int> mySet(myints, myints + 5);
好吧,诚然,有两行:)
答案 1 :(得分:8)
您可以查看Boost.Assign,它允许您编写如下内容:
const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11);
答案 2 :(得分:6)
在C ++ 0x中,标准将Initializer List定义为对这种(笨拙)构造的改进。
现在容易得多:
std::set<int> set = {10, 20, 30, 40, 50};
标准库只需为set:
声明以下构造函数template <typename Value, typename Compare, typename Allocator>
set<Value, Compare, Allocator>::set(std::initializer_list<Value> list);
我们所有的担忧都被巧妙地消除了。
答案 3 :(得分:4)
你可能想看看Boost.Assign:
http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html
答案 4 :(得分:4)
如果您的初始数据位于某个容器std::some_container<A> a;
中,该容器具有开始和结束迭代器,并且这是前向迭代器或最佳迭代器(它们应该有operator ++重载),那么您可以通过这种方式进行新设置。
std::set<A> s(a.begin(), a.end());
答案 5 :(得分:3)
这是一个C ++ 0x替代Moo-Juice的答案,其中A的构造比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);