如何从vector <std :: string> </std :: string>获取max_element

时间:2014-11-26 02:09:53

标签: c++ c++11 vector max

使用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>中找到最大值?

4 个答案:

答案 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*

在这种情况下,myintsmyints + 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::stringint,但您正在尝试传递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';