【问题标题】:C++ std::reduce with arrayC++ std::reduce 与数组
【发布时间】:2020-12-04 20:21:07
【问题描述】:
int arr1[5] = { 1,2,3,4,5 };
int sum = reduce(arr1[0], arr1[5]);

我编写此代码是为了将std::reduce 函数与整数数组一起使用。我应该如何定义数组的开头和结尾?

【问题讨论】:

  • 为什么不使用std::vector ?那么你将拥有beginend
  • @TonyTannous 我知道它适用于向量,只是想知道它是否也适用于数组
  • @TonyTannous C++11 及更高版本有std::begin()std::end(),它们适用于容器和固定数组。
  • reduce() 接受迭代器,而不是元素的值。选项包括reduce(&arr1[0], &arr1[5])(注意&s)、reduce(arr1, arr1 + 5) 或(避免对数组长度进行硬编码,如果数组长度发生更改并且您忘记更新所有用法,则会中断)、reduce(&arr1[0], &arr1[sizeof(arr1)/sizeof(arr[0])])、@987654333 @。最好的方法是使用标准库,并做reduce(std::begin(arr1), std::end(arr1))

标签: c++ stl iterator std


【解决方案1】:

在数组上使用std::cbegin()std::cend()

#include <iostream>
#include <numeric>
int main(){
    int arr1[5] = { 1,2,3,4,5 };
    int sum = std::reduce(std::cbegin(arr1), std::cend(arr1));
    std::cout << sum;
}

Demo

【讨论】:

  • 如果将原始数组作为参数传递给函数会怎样?
  • @Tony 如果它作为 T[size] (这是一个特定大小的数组)而不是 T[] (衰减为指针)传递。见here。尝试在原始指针上使用 std::begin()std::end() 将导致编译错误。
  • @TonyTannous 这取决于你接受的函数的参数
  • @Javadkhan 使用 reduce(arr1, arr1+5);
  • 使用std::begin(T)std::end(T) 的好处是当您有一个正在迭代的数组,但随后决定将其升级到STL 容器时。现在您不必梳理所有代码并将arr1, arr1 + 5 替换为arr1.begin(), arr1.end()
【解决方案2】:

如果你经常在容器上使用&lt;algorithm&gt; 算法,你可以这样写:

template <typename Container>
constexpr typename Container::value_type 
reduce(const Container& container) {
   return std::reduce(std::cbegin(container), std::cend(container));
}

那么你可以:

int arr1[5] = { 1,2,3,4,5 };
auto sum = reduce(arr1);

这有几个缺点,包括:


PS - 正如@Ben 所指出的,Boost 库 have 这样的容器适配器适用于大多数 &lt;algorithm&gt; 函数......但不适用于 std::reduce

【讨论】:

  • 顺便说一句,boost 提供了这些取值范围的函数。
  • @Ben:你是对的,但 doesn't seem 包含一个 std::reduce 变体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2016-09-24
  • 1970-01-01
  • 2020-08-20
  • 2014-08-07
  • 2012-05-20
  • 2017-01-15
相关资源
最近更新 更多