我是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;
}
i1 = std::max_element(myvector.begin(), myvector.end(), comp1_);
是错的
i1 = std::max_element(myvector.begin(), myvector.end(), comp2);
会工作。
通过使用comp1_
和max_element
,你实际上要求最小元素,因为max_element找到元素x,对于任何y,comp1_(x,y)都不是真的。
你已经有效地做了一个双重否定,你已经切换到要求最大元素,但也通过反转你已经切换到再次要求最小值的比较函数。
使用min_element
和max_element
时应该做的是传递比较函数,意思是“小于”,然后这些函数将按照他们的说法进行。
你现在可能意识到这一点
i2 = std::min_element(myvector.begin(), myvector.end(), comp1_);
会得到你最大的元素。
你的问题只是你错误地使用max_element
。它期望一个比较,如果第一个参数小于第二个参数,则返回true。在这两种情况下,您都需要使用comp2_
。所以在你的程序中应该阅读
i1 = std::max_element(myvector.begin(), myvector.end(), comp2);
达到你想要的最好的做法是使用像Jesper提到的minmax_element
#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;
。我认为这是不好的做法。
您还需要使用comp2来调用std :: max_element。比较运算符对于min_element和max_element都是相同的。
或者你也可以使用i1 = std::min_element(myvector.begin(), myvector.end(), comp1_);