【问题标题】:Convert array to set in C++将数组转换为 C++ 中的设置
【发布时间】:2013-12-15 18:43:52
【问题描述】:

有没有更简单的方法可以使用 c++ 将数组转换为集合,而不是循环遍历其元素?

最好使用标准模板库

【问题讨论】:

  • 应该提到我对 C++ 很陌生,并且来自 Objective C 背景

标签: c++ arrays set


【解决方案1】:

对于所有标准库容器类型,使用constructor

std::set<T> set(begin(array), end(array));

【讨论】:

  • +1。 FWIW,这仍然可能是引擎盖下的循环,但优点是您不需要编写该循环,如果set 的作者很聪明,他们可以应用您不需要学习的各种优化。
  • 或者如果你想更新一个现有的集合s,那么做:s.insert(begin(array), end(array));
【解决方案2】:
int a[] = {1,2,3,4};
std::set<int> s{1,2,3,4};

std::set<int> s1{std::begin(a), std::end(a)};

见:Here

【讨论】:

  • @H2CO3 为什么不合逻辑?
  • 因为对我来说,初始化列表是用来初始化容器的对象列表。这种基于范围和迭代器的方法对我来说更像是构造函数重载问题,但这只是个人意见。
  • @H2CO3 不是初始化列表,即“统一初始化”。
  • @H2CO3 术语该死,我也很不擅长这些,对不起我的不好
【解决方案3】:
#include <set>
#include <utility>
#include <iostream>
using namespace std;

auto main()
    -> int
{
    static int const a[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 4};
    set<int> const  numbers( begin( a ), end( a ) );
    for( auto const v : numbers ) { cout << v; }
    cout << endl;
}

【讨论】:

  • 只是想知道,为什么你声明 main 带有尾随返回类型?
  • @polkadotcadaver:我将它用作 single 函数声明语法,适用于模板、lambda 和普通函数。除了是一个统一的符号之外,它还有一个视觉优势,即函数名称总是出现在视觉上的相同位置,并且返回类型也相同,无论多长或多短。这是扫描代码的一个优势,无需阅读详细信息。
  • 我明白了 - 很公平,你的选择。我个人不能说我会改用可读性较差的 (imo) 语法来保持一致性,没有它就无法编写少量代码。尤其是在这些少数情况下,很快就会通过自动返回类型更好地解决。
【解决方案4】:

如果您想在将数组中的值插入(或插入时)到集合之前对它们执行一些操作,您可以使用 std::transform。

【讨论】:

    【解决方案5】:
    int arr{} = {1,55,4,2,35,1,5}; //declare the array
    int arrSize = sizeof(arr)/sizeof(arr[0]); //get size of the array
    set<int> s(arr, arr+arrSize);  //move the array to the set ***
    

    【讨论】:

    • sizeof(arr)/sizeof(arr[0])
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多