- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图从一大块内存中的某个范围中读取最小值,我想将内存范围提供给一个函数,然后找到最小元素。我需要这样做,因为我不能更改代码或使用动态内存分配。
我在 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
具有 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)
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/
可以std::min_element (还有 std::sort 和来自 的类似函数)用于仅具有偏序的类型? 例如: auto it = std::min_element(vec.cbegin(),
我在使用 C++ 算法 header 中的 min_element() 时遇到问题。 代码如下: int a[5] = {4, 1, 2, 3, 4}; for (int j = n - 1; j >
我正在尝试使用模板类构建一个自制的最小堆,以便我可以在 Dijkstra 或 Prim 上工作。然而,find_min() 函数不适用于 std::min_element()。任何线索将不胜感激。谢谢
我在我创建的这个具有索引的 Node 对象上使用 std::min_element。我有一个 std::set 容器,其中包含 10 个具有不同索引的节点,然后我调用 std::min_element
当我使用 std::min_element 时,我一直在为 C2440 编译错误而苦苦挣扎: struct compare_x_coordinate { bool operator() (Geoc
std::vector cMinDist; for (int i = 0; i temp; for (int j = 0; j ::iterator result =std:
我正在编写一个程序来使用 graham scan 计算凸包的周长并且需要在一组数据点中找到最低的 y 坐标。我正在使用 std::min_element(vector.begin(), vector.
std::min_element将返回由 operatorR 所针对的元素取最小值? 显然我可以定义 bool Pred(t1,t2) { return f(t1) < f(t2); }但当 f 是
我想找到一个 vector 的最小值: #include #include #include using namespace std; int main () { vector v{2,
如何保存 min_element 的值?它说它是一个前向迭代器,但我似乎无法弄清楚如何保存(分配给一个变量)它。我希望能够通过 vector 中的位置访问它。我所能找到的只是使用实际元素的示例(使用
我正在尝试找到 GPU 上数组的最小值。我可以在 cpu 上使用 min_element,但不知道如何在 gpu 上使用 min_element。我也很困惑为什么 min_element 的返回必须是
我正在尝试找到 GPU 上数组的最小值。我可以在 cpu 上使用 min_element,但不知道如何在 gpu 上使用 min_element。我也很困惑为什么 min_element 的返回必须是
假设给定一个二维点 vector ,并期望找到具有最少 Euclidean norm 的点. 点数以 std::vector points 形式提供。以下是 typedef std::pair poi
所以我有一个按以下方式定义和使用的结构 vector : enum ID { alpha, beta, gamma }; using TimePoint = std::chro
这是我的代码: #include #include #include using namespace std; class A { struct CompareMe { bool o
我正在写一个小例子来尝试理解 boost::signal 的多个返回值。然而,结果对我来说似乎很奇怪。 #include #include #include int func1() {
在这个问题的评论中is-there-a-way-to-iterate-over-at-most-n-elements-using-range-based-for-loop还有一个问题 - 是否可以在容
#include #include #include using namespace std; int main() { std::map A; const auto it =
我有一个 while 循环,它用一些 double 初始化一个 list。 我想输出最小值,但到目前为止我所做的似乎没有用,因为我没有得到任何输出。 这是我代码的相关部分: list allD
我正在优化 pycuda/推力程序。其中,我使用 thrust::min_element标识设备上数组中最小元素的索引。 使用 Nvidia 的可视化分析器,似乎每当我调用 thrust::min_e
我是一名优秀的程序员,十分优秀!