C++ 如何将std::数组实例地址作为参数传递给std::min\u元素?

C++ 如何将std::数组实例地址作为参数传递给std::min\u元素?,c++,arrays,c++11,gcc,C++,Arrays,C++11,Gcc,我试图从一大块内存中的一个范围中读取最小值,我想为一个函数提供内存范围,然后找到最小元素。我需要这样做,因为我不能更改代码或使用动态内存分配 我在Win7中使用了MinGW-W64-builds-4.3.5 我在中看到了一个例子,但它们使用的是C风格的数组,我知道我可以使用它作为指向内存地址的指针,并执行指针算法来指示范围的结束 // min_element/max_element example #include <iostream> // std::cout #inclu

我试图从一大块内存中的一个范围中读取最小值,我想为一个函数提供内存范围,然后找到最小元素。我需要这样做,因为我不能更改代码或使用动态内存分配

我在Win7中使用了MinGW-W64-builds-4.3.5

我在中看到了一个例子,但它们使用的是C风格的数组,我知道我可以使用它作为指向内存地址的指针,并执行指针算法来指示范围的结束

// min_element/max_element example
#include <iostream>     // std::cout
#include <algorithm>    // std::min_element, std::max_element

bool myfn(int i, int j) { return i<j; }

struct myclass {
  bool operator() (int i,int j) { return i<j; }
} myobj;

int main () {
  int myints[] = {3,7,2,5,6,4,9};

  // using default comparison:
  std::cout << "The smallest element is " << *std::min_element(myints,myints+7) << '\n';
  std::cout << "The largest element is "  << *std::max_element(myints,myints+7) << '\n';

  // using function myfn as comp:
  std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myfn) << '\n';
  std::cout << "The largest element is "  << *std::max_element(myints,myints+7,myfn) << '\n';

  // using object myobj as comp:
  std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myobj) << '\n';
  std::cout << "The largest element is "  << *std::max_element(myints,myints+7,myobj) << '\n';

  return 0;
}
我想用std::array做一些类似的事情,但是由于迭代器的原因,我遇到了编译器错误,有没有办法用std::array做一些类似的事情。这是我的密码:

#define N_ELEMENTS (128u)
short int FindMinElement(const std::array<short int, N_ELEMENTS>& array)
{
    return *(std::min_element(array, array+N_ELEMENTS));
}
以下是我的编译器输出:

> Executing task: g++.exe -Wall -g c:\Users\uidr8361\Desktop\C++\Tmp\ReadArcPixels.cpp <

c:\Users\uidr8361\Desktop\C++\Tmp\ReadArcPixels.cpp: In function 'short int FindMinElement(const std::array<short int, 128>&)':
c:\Users\uidr8361\Desktop\C++\Tmp\ReadArcPixels.cpp:41:55: error: no matching function for call to 'min_element(const std::array<short int, 128>&, const std::array<short int, 128>*)'
     return *(std::min_element(array, &array+N_ELEMENTS));
                                                       ^
In file included from C:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:62,
                 from c:\Users\uidr8361\Desktop\C++\Tmp\ReadArcPixels.cpp:4:
C:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:5610:12: note: candidate: 'template<class _FIter> constexpr _FIter std::min_element(_FIter, _FIter)'
     inline min_element(_ForwardIterator __first, _ForwardIterator __last)
            ^~~~~~~~~~~
C:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:5610:12: note:   template argument deduction/substitution failed:
c:\Users\uidr8361\Desktop\C++\Tmp\ReadArcPixels.cpp:41:55: note:   deduced conflicting types for parameter '_FIter' ('std::array<short int, 128>' and 'const std::array<short int, 128>*')
     return *(std::min_element(array, &array+N_ELEMENTS));
                                                       ^
In file included from C:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:62,
                 from c:\Users\uidr8361\Desktop\C++\Tmp\ReadArcPixels.cpp:4:
C:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:5635:5: note: candidate: 'template<class _FIter, class _Compare> constexpr _FIter std::min_element(_FIter, _FIter, _Compare)'
     min_element(_ForwardIterator __first, _ForwardIterator __last,
     ^~~~~~~~~~~
C:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:5635:5: note:   template argument deduction/substitution failed:
c:\Users\uidr8361\Desktop\C++\Tmp\ReadArcPixels.cpp:41:55: note:   deduced conflicting types for parameter '_FIter' ('std::array<short int, 128>' and 'const std::array<short int, 128>*')
     return *(std::min_element(array, &array+N_ELEMENTS));
注意:我必须非常明确地址的范围,因为我使用的是一个大的多维数组,所以我不能使用std::begin或std::end。另外,我不能使用vector,因为我需要使用静态内存分配,而不是动态内存分配

编辑:

谢谢大家的回答,但我这里也有一个限制,正如我前面提到的,我传递给函数的数组比N_元素大,这也会由于类型转换而导致编译错误。所以,@ PrimyEthyEdter解决方案对我来说很好,但是我正在寻找一个更现代的C++ C++ 11,就像解决方案一样。

STD::数组有开始和结束成员函数,这些函数给你一个迭代器,直到数组的末尾。你可以像这样使用它们

#define N_ELEMENTS (128u)
short int FindMinElement(const std::array<short int, N_ELEMENTS>& array)
{
    return *std::min_element(array.begin(), array.end());
}
而不是

#define N_ELEMENTS (128u)
对于常量。

std::array具有begin和end成员函数,这些函数为您提供数组开头的迭代器和数组末尾的迭代器。你可以像这样使用它们

#define N_ELEMENTS (128u)
short int FindMinElement(const std::array<short int, N_ELEMENTS>& array)
{
    return *std::min_element(array.begin(), array.end());
}
而不是

#define N_ELEMENTS (128u)
常数。

当然可以

您可以将指向数据类型的指针传递到std::min_元素函数中,它们充当随机迭代器。您不需要使用begin和end函数,数组中的任何指针都可以工作。例如:

#include <array>
#include <algorithm>
#include <iostream>

int main()
{
    std::array<int,1000> arr;

    size_t size = arr.size();
    int* start = &arr[0];
    int* finish = start + size;

    for (int* i = start; i < finish; ++i) *i = rand();

    int* minP = std::min_element(start, finish);

    int minVal = *minP;

    std::cout << minVal;
}
你当然可以

您可以将指向数据类型的指针传递到std::min_元素函数中,它们充当随机迭代器。您不需要使用begin和end函数,数组中的任何指针都可以工作。例如:

#include <array>
#include <algorithm>
#include <iostream>

int main()
{
    std::array<int,1000> arr;

    size_t size = arr.size();
    int* start = &arr[0];
    int* finish = start + size;

    for (int* i = start; i < finish; ++i) *i = rand();

    int* minP = std::min_element(start, finish);

    int minVal = *minP;

    std::cout << minVal;
}

您仍然可以使用begin,std::min_elementmyints.begin,myints.begin+7,myobj;您仍然可以使用begin,std::min_elementmyints.begin,myints.begin+7,myobj@Sirgay更新了。@FrançoisAndrieux出于某种原因,我认为数组提供了自己的重载。相反,它将它们作为成员函数,所以我已经更新以显示这一点。您可能在考虑c数组,它显然不能有成员,所以只能有自由函数的专用重载。他特别要求不要使用开始函数和结束函数。@PlinyTheElder但那个注释似乎是基于一个错误的假设,即不能用这些函数指定子范围。@Sirgay更新了。@FrançoisAndrieux出于某种原因我认为是数组提供了它自己的重载。相反,它将它们作为成员函数,所以我已经更新以显示这一点。您可能在考虑c数组,显然不能有成员,所以有专门的自由函数重载。他特别要求不要使用开始函数和结束函数。@PlinyTheElder但那个注释似乎是基于一个错误的假设,即不能用这些函数指定子范围。这个答案在技术上是正确的,但这远不是首选的解决方案。我认为arr.data比&arr[0]@François Andrieux好:他明确要求不要使用begin和end函数。指针是直接的选择。@sirgay:有争议。使用&arr[0]可以直接看到其意图。他要求不要使用std::begin和std::end函数,我认为这是指独立函数。成员函数begin和end应该是公平的。这个答案在技术上是正确的,但远不是首选的解决方案。我认为arr.data比&arr[0]@François Andrieux好:他特别要求不要使用begin和end函数。指针是直接的选择。@sirgay:有争议。使用&arr[0]可以直接看到其意图。他要求不要使用std::begin和std::end函数,我认为这是指独立函数。成员功能的开始和结束应该是公平的游戏。