为什么max_element不显示向量C++中最大的字符串?

czq61nw1  于 2023-05-24  发布在  其他
关注(0)|答案(1)|浏览(135)

在下面的代码中,我尝试使用std::max_element打印std::vector中最大的std::string
我希望下面代码的输出是:

Harmlessness

我得到的实际输出是:

This

验证码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
    vector <string> strlist;
    strlist.push_back("This");
    strlist.push_back("Harmless");
    strlist.push_back("Harmlessness");
    cout << *max_element(strlist.begin(), strlist.end());
    return 0;
}

我的问题:

你能解释一下为什么代码产生了上面的实际输出而不是我期望的输出吗?

wfypjpf4

wfypjpf41#

std::string的默认比较器执行**lexicographic比较**(请参见:std::string comparators)。
字符串 “This” 在此顺序中比任何以 “H” 开头的字符串都要晚。
您可以使用std::max_element的另一个重载,它接受一个显式的比较器参数:
template<class ForwardIt,class Compare> constexpr ForwardIt max_element(ForwardIt first,ForwardIt last,Compare comp);
如果你想按长度比较字符串,可以用途:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector <std::string> strlist;
    strlist.push_back("This");
    strlist.push_back("Harmless");
    strlist.push_back("Harmlessness");
    
    // Use an explicit comparator, in this case with a lambda:
    std::cout << *max_element(strlist.begin(), strlist.end(), 
                         [](std::string const& a, std::string const& b) {return a.length() < b.length(); });
    return 0;
}

输出:

Harmlessness

**旁注:**最好避免using namespace std-参见此处Why is "using namespace std;" considered bad practice?

相关问题