【发布时间】:2011-05-10 18:08:21
【问题描述】:
目前我正在创建一个这样的新集合:
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
有没有办法在一行中创建s?
【问题讨论】:
目前我正在创建一个这样的新集合:
std::set<A> s;
s.insert(a1);
s.insert(a2);
s.insert(a3);
...
s.insert(a10);
有没有办法在一行中创建s?
【问题讨论】:
您可以查看Boost.Assign,它允许您编写诸如:
const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11);
【讨论】:
您可能想看看 Boost.Assign:
http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html
【讨论】:
int myints[]= {10,20,30,40,50};
std::set<int> mySet(myints, myints + 5);
好吧,两行:)
【讨论】:
+1 来自我。使用these 更容易。
... mySet(myints, myints+_countof(myints)) ...
myints + sizeof(myints)/sizeof(int)。
这是 Moo-Juice 的 C++0x 替代方案,用于解决 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);
【讨论】:
在 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);
我们所有的烦恼都一扫而空。
【讨论】:
std::set<int> set = {10, 20, 30, 40, 50};,而不必包含template <typename Value, typename Compare, typename Allocator> set<Value, Compare, Allocator>::set(std::initializer_list<Value> list);。 Ideone example here.
如果您的初始数据位于某个容器 std::some_container<A> a; 中,该容器具有开始和结束迭代器,并且这是前向迭代器或最佳迭代器(它们只是应该重载 operator++),那么您可以通过这种方式进行新设置。
std::set<A> s(a.begin(), a.end());
【讨论】: