关于c ++:有没有快速创建集合的方法?

Is there a quick way to create a set?

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

1
2
3
4
5
6
    std::set<A> s;
    s.insert(a1);
    s.insert(a2);
    s.insert(a3);
    ...
    s.insert(a10);

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


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

好吧,诚然有两行:)


您可以查看boost.assign,它允许您编写以下内容:

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


在C++0x中,标准定义了初始化器列表作为对这种(笨拙)构造的改进。

现在更容易了:

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

标准库只需声明集合的以下构造函数:

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

我们所有的忧虑都被一扫而光了。


如果您的初始数据位于某个容器std::some_container a;中,该容器具有开始和结束迭代器,而这是前向迭代器或最佳迭代器(它们只应使operator++过载),那么您可以通过这种方式创建新的集合。

1
std::set<A> s(a.begin(), a.end());

您可能想看看Boost。分配:

http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html


这里有一个C++0x替代MOO果汁的答案,其中A的构造比EDCOX1(0)更昂贵。

1
2
3
4
5
6
7
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);