我是C ++的新手,我试图找到std::vector
的最小和最大元素,但是std::min_element()
和std::max_element()
不能一起工作。给定的输出仅为最小值。在输出中,仅将最小值打印两次,而不是先打印最小值然后再打印最大值。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool comp1_(int a, int b)
{
return a > b;
}
bool comp2(int a, int b)
{
return a < b;
}
int main()
{
vector<int> myvector;
vector<int>::iterator i1;
vector<int>::iterator i2;
int n, num;
cin >> n;
for(int i = 0; i < n; i++){
cin >> num;
myvector.push_back(num);
}
i2 = std::min_element(myvector.begin(), myvector.end(), comp2);
cout << *i2 << " ";
i1 = std::max_element(myvector.begin(), myvector.end(), comp1_);
cout << *i1;
return 0;
}
答案 0 :(得分:3)
您的问题仅仅是因为您错误地使用了max_element
。如果第一个参数小于第二个参数,则期望比较返回true。在这两种情况下,您都将需要使用comp2_
。因此,在您的程序中,它应该显示为
i1 = std::max_element(myvector.begin(), myvector.end(), comp2);
实现您想要的目标的最佳做法是使用minmax_element
,如提到的Jesper
#include <iostream>
#include <algorithm>
#include <vector>
bool compLess(int a, int b)
{
return (a < b);
}
int main()
{
using namespace std;
vector<int> myvector;
int n, num;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num;
myvector.push_back(num);
}
auto minmax = std::minmax_element(myvector.begin(), myvector.end(), compLess);
cout << "min: " << *minmax.first << "\tmax:" << *minmax.second << "\n";
return 0;
}
有了这个,您不必遍历数组两次。
提示请勿在全局名称空间中使用using namespace std;
。我认为这是不好的做法。
答案 1 :(得分:0)
i1 = std::max_element(myvector.begin(), myvector.end(), comp1_);
错了
i1 = std::max_element(myvector.begin(), myvector.end(), comp2);
会工作的。
通过将comp1_
与max_element
一起使用,您实际上是在询问最小元素,因为max_element会找到comp1_(x,y)对于任何y都不为真的元素x。
您实际上已经做了一个双重否定,您已经切换到要求最大的元素,但是还反转了您切换到再次要求最小的比较功能。
使用min_element
和max_element
时应该做的就是传递一个比较函数,表示“小于”,然后这些函数将按照它们说的去做。
您现在可能意识到
i2 = std::min_element(myvector.begin(), myvector.end(), comp1_);
会让您获得最大的收获。
答案 2 :(得分:0)
您还需要使用comp2来调用std :: max_element。 min_element和max_element的比较运算符相同。
或者,您也可以使用
i1 = std::min_element(myvector.begin(), myvector.end(), comp1_);
也请检出https://en.cppreference.com/w/cpp/algorithm/max_element。