【问题标题】:Is there a quick way to create a set?有没有快速创建集合的方法?
【发布时间】:2011-05-10 18:08:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

    您可以查看Boost.Assign,它允许您编写诸如:

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

    【讨论】:

    • 是的,你可以! :) (你比我快 5 秒...)
    【解决方案2】:

    【讨论】:

    • 这是对重载逗号运算符的一个很好的使用:+1
    【解决方案3】:
    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)
    【解决方案4】:

    这是 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);
    

    【讨论】:

    • @Moo-Juice - 是的,但灵感来自您的原始版本。
    【解决方案5】:

    在 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);
    

    我们所有的烦恼都一扫而空。

    【讨论】:

    • 请注意,现在使用 C++11,您甚至不需要声明该构造函数。
    • @Claudiu:恐怕我不太明白你的意思。
    • 我的意思是你可以在你的代码中使用std::set&lt;int&gt; set = {10, 20, 30, 40, 50};,而不必包含template &lt;typename Value, typename Compare, typename Allocator&gt; set&lt;Value, Compare, Allocator&gt;::set(std::initializer_list&lt;Value&gt; list);Ideone example here.
    • @Claudiu:是的,集合构造函数是集合提供的(不是用户提供的),这里提到它只是为了暴露(暴露正在使用的特性)。
    • @Claudiu:好主意!我编辑了您的措辞。感谢您帮助我改进此答案。
    【解决方案6】:

    如果您的初始数据位于某个容器 std::some_container&lt;A&gt; a; 中,该容器具有开始和结束迭代器,并且这是前向迭代器或最佳迭代器(它们只是应该重载 operator++),那么您可以通过这种方式进行新设置。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 2019-03-11
      • 2021-05-29
      • 2012-08-31
      • 2013-09-16
      • 2013-04-16
      • 1970-01-01
      • 2014-08-23
      相关资源
      最近更新 更多