【问题标题】:Are there STL functions to split/splice C-style arrays into smaller arrays?是否有 STL 函数可以将 C 样式的数组拆分/拼接成更小的数组?
【发布时间】:2014-03-14 18:04:07
【问题描述】:

假设我有一个 C 风格的数组(int numbers[10])。我想将数组拆分为奇数数组和偶数数组。此外,我想使用谓词来确定一个数字是否为奇数。

问题:我很好奇 - 是否有 STL 函数可以做到这一点?

我能找到的最接近的东西是 list::splice,但这不适用于 C 风格的数组,也不需要谓词。

【问题讨论】:

    标签: c++ arrays stl


    【解决方案1】:

    std::partition() 可以工作。

    确实,该页面上的示例 1 将偶数和奇数分开。它在向量上执行此操作,但没有理由不适用于本机数组。

    下面是我编写的一个简单示例:

    #include <algorithm>
    #include <iostream>
    
    int main()
    {
        int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        auto mid = std::partition(std::begin(a), std::end(a),
                [](int n){return n%2;});
    
        std::cout << "Odd: " << std::endl;
        for (auto p = std::begin(a); p < mid; ++p)
        {
            std::cout << *p << std::endl;
        }
    
        std::cout << "Even: " << std::endl;
        for (auto p = mid; p < std::end(a); ++p)
        {
            std::cout << *p << std::endl;
        }
    }
    

    【讨论】:

    • 假设我想要一个 C 样式数组中的所有偶数和另一个中的所有赔率。我想只是用数组插入替换for循环中的cout?可能有一个 STL 函数执行分区并返回数组的集合(所以在这个例子中,一个指向奇数数组和偶数数组的数组)?
    • @Craig:std::partition() 的返回值是一个迭代器(在原生数组的情况下,它是一个指针),指向与谓词不匹配的第一项(偶数数字,在这种情况下)。它还充当匹配项的“结束”迭代器。在大多数情况下,您无需将它们复制或移动到任何地方。
    【解决方案2】:

    确实可以:std::partition 根据谓词对序列进行分区。

    auto begin = std::begin(array);
    auto end   = std::end(array);
    auto part  = std::partition(begin, end, [](int n){return n%2;});
    

    现在[begin,part) 包含奇数值(谓词为真),[part,end) 包含偶数值(谓词为假)。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2022-12-02
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      相关资源
      最近更新 更多