gpt4 book ai didi

c++ - 如何将 std::array 实例地址作为参数传递给 std::min_element?

转载 作者:行者123 更新时间:2023-11-30 01:36:19 24 4
gpt4 key购买 nike

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

我在 Win 7 中使用 MinGW-W64-builds-4.3.5。

我在 http://www.cplusplus.com/reference/algorithm/min_element/ 中看到了一个例子但他们使用的是 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::结尾()。我也不能使用 vector ,因为我需要使用静态内存分配而不是动态的。

编辑:

感谢大家的回答,但我在这里也有一个限制,正如我上面提到的,我传递给函数的数组大于 N_ELEMENTS,这也会导致编译错误由于类型转换。所以@PlinyTheElder 解决方案对我来说效果很好,但我正在寻找更现代的 C++(C++11 以上)解决方案。

最佳答案

std::array 具有 beginend 成员函数,它们为您提供指向数组开头和结尾的迭代器。您可以使用它们来代替

#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)
short int FindMinElement(const std::array<short int, N_ELEMENTS>& array)
{
return *std::min_element(array.begin(), array.begin() + N_ELEMENTS);
}

你可能还想考虑类似的东西

constexpr auto N_ELEMENTS = 128u;

代替

#define N_ELEMENTS (128u)

常量。

关于c++ - 如何将 std::array 实例地址作为参数传递给 std::min_element?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52431819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com