为什么我的重载<运算符不适用于 STL 排序
Why isn't my overloading < operator not working for STL sort
我有下面的代码,我想根据字符串的最后一个字符对字符串的矢量进行排序。我已经完成了以下操作,但排序是按默认规则完成的。
这是过载<部件:
bool operator<(const string &s1, const string &s2){
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}
这主要是:
vector <string> nameList;
int n;
cin>>n;
while(n--){
string name;
char str[100];
cin>>str;
name += str;
nameList.push_back(name);
}
sort(nameList.begin(), nameList.end());
for(int i = 0; i < nameList.size(); i++)
cout<<nameList.at(i)<<endl;
视频中的代码:LINK
如前所述,您的operator<
没有被调用,std::string
在std
命名空间中已经重载了运算符。
std::sort
有两个版本,一个使用operator<
,另一个使用自定义谓词对容器进行排序。添加自定义谓词,您仍然可以根据需要使用sort
对vector
进行排序;
#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
bool lastchar(const string &s1, const string &s2){
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}
int main(){
vector <string> nameList;
int n;
cin>>n;
while(n--){
string name;
char str[100];
cin>>str;
name += str;
nameList.push_back(name);
}
sort(nameList.begin(), nameList.end(), &lastchar);
for(int i = 0; i < nameList.size(); i++)
cout<<endl<<nameList.at(i);
return 0;
}
我称它为lastchar
,但你可以称它为有史以来最好的。额外的好处是,如果您可以使用C++11或更高版本,则可以使谓词成为lambda。
sort(nameList.begin(), nameList.end(), [] (const string &s1, const string &s2){
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
});
它没有被使用,你必须将它传递到std::sort
中——类似于:
sort(nameList.begin(), nameList.end(), [](const string &s1, const string &s2) {
return s1.at(s1.size() - 1) < s2.at(s2.size() - 1);
}
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 为什么这适用于 G++ 而不是 CLANG?
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 声明适用于 auto,但不能显式声明类型?
- 什么是通用运行时组件 #ifdef 适用于Windows(UWP)而不是iOS
- Windows 上的 Cmake 不添加共享库路径(适用于 linux)
- Typedef适用于结构,但不适用于枚举,仅适用于C++
- 为什么函数模板不理解 NULL,但适用于 nullptr
- 链接器读取库,但在其中找不到符号?未解析的外部符号,但仅适用于 Win32 而不是 x64
- Netbeans 8.1(适用于 C/C++)找不到我的编译器(gcc-6.0.0 开发版本)
- random_shuffle() 适用于 Windows,但不能在 Linux 上编译
- C++指针到方法模板推导在面向 x86 时不编译,但适用于 x64
- 不在异常中嵌入std::字符串的规则是否仍然适用于move构造函数
- 移动文件夹Windows c++:适用于Vista及以上版本,不包括XP
- 适用于Android的Qt找不到任何兼容的设备答案找到但不知道如何
- 在Windows 7上不起作用,但它适用于Windows 8 dll。
- 可变参数模板转换为 std::function<R(ARGS...)>适用于 GCC 而不是 MSVC2013,为什么?
- C++11 cmath 函数不在 std 命名空间中,适用于 android NDK w/gcc-4.8 或 clang