有没有快速创建集合的方法?

时间:2010-11-16 11:00:08

标签: c++ stl set

目前我正在创建一个这样的新集:

    std::set<A> s;
    s.insert(a1);
    s.insert(a2);
    s.insert(a3);
    ...
    s.insert(a10);

有没有办法在一行中创建s

6 个答案:

答案 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)

答案 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);