使用cplusplus.com中的代码,我试图找到vector<std::string>
中的max int值。
vector是std :: string格式,这里没有选择。
bool myfn(int i, int j)
{
return i < j;
}
vector<std::string> dat;
dat.push_back(2.1);
dat.push_back(5.3);
for (int l = 0; l < dat.size(); ++l)
{
std::cout << *std::max_element(dat.begin(), dat.end(), myfn) << '\n';
}
预期产出:
3
错误:
.cpp:76:93: error: no matching function for call to 'max_element(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >::size_type, bool (&)(int, int))'
如何在vector<std::string>
中找到最大值?
答案 0 :(得分:4)
您使用错误的参数调用max_element
。它需要两个迭代器和一个函数:
template <class ForwardIterator, class Compare>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last,
Compare comp);
你用矢量和大小来调用它。混淆可能源于您链接的引用上的示例:
std::min_element(myints, myints +7, myfn)
// ^^^^^^ ^^^^^^^^^
// int* int*
在这种情况下,myints
和myints + 7
都是int*
类型,原始指针是迭代器。但是,在您的情况下,您传递了两个不同的类型(vector<string>
和size_t
),其中都不是迭代器。所以你需要改为:
*std::max_element(dat.begin(), dat.end(), myfn)
或者,为了说明与参考中的示例等效的内容(尽管肯定更喜欢上述内容):
std::string* first = &dat[0];
*std::max_element(first, first + dat.size(), myfn)
哪个有效,因为在这种情况下我传递了两个string*
,它们是迭代器。
(同样根据您的使用情况,dat
应为vector<int>
而不是vector<string>
。)
答案 1 :(得分:2)
你有一个充满字符串vector<std::string> dat;
的向量,但你的比较函数需要2个整数。您可能想要更改存储在向量中的类型或更改您使用的比较函数。如果使用整数,则默认比较运算符将执行您想要的操作,而无需编写自定义函数。
同样std::max_element
期望在开始时使用一个迭代器,在结束时使用一个迭代器,因此您需要将调用更改为std::max_element(dat.begin(), dat.end(), myfn)
。您可能会注意到实际上不需要您拥有的循环,因为您已经通过调用std::max_element
已经超过该范围,所有这个循环都会多次计算完全相同的值,您只需要计算一次。 / p>
答案 2 :(得分:1)
你想要push_back int你的std :: vector dat声明是错误的。 std :: max_element和std :: min_element返回迭代器而不是值。您可以查看以下示例
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
std::vector<int> v {1,2,3,4,6};
auto biggest = std::max_element(std::begin(v), std::end(v));
std::cout << "Max element is " << *biggest
<< " at position " << std::distance(std::begin(v), biggest) << std::endl;
auto smallest = std::min_element(std::begin(v), std::end(v));
std::cout << "min element is " << *smallest
<< " at position " << std::distance(std::begin(v), smallest) << std::endl;
return 0;
}
答案 3 :(得分:0)
指针可以是迭代器。这使您可以将数组用作标准库函数中的范围。 myints
是一个表达式,它引用数组的第一个元素,而myints + 7
表示一个超出数组末尾的表达式。同样,您可以执行std::begin(myints)
和std::end(myints)
。标准容器以这些成员函数myvector.begin()
和myvector.end()
的形式公开迭代器。您将这些迭代器而不是容器和大小传递给std::max_element
。
默认情况下,std::max_element
使用operator<
来比较元素。在这种情况下,您不需要比较器仿函数。
std::vector
value_type
std::string
为int
,但您正在尝试传递value_type
。要么将std::to_string
更改为int,要么使用字符串转换函数,即C ++ 11&#39} {。}}。
最后,你的循环完全没必要。范围内的std::max_element
运营商。
std::vector<int> dat;
dat.push_back(1);
dat.push_back(3);
std::cout << *std::max_element(dat.begin(), dat.end()) << '\n';