问题描述
最近,我寻求帮助来修复将代码按一定顺序排序然后基于多个变量(如果这些向量相同)进行排序的代码。我有此代码可以工作(我认为),但无法将其打印出来进行检查。就目前而言,这里是代码。我可以确认一切正常,除了排序。因此,我想知道一种检查排序列表的好方法。
#include <string>
#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
#include <bits/stdc++.h>
#include <time.h>
using namespace std;
struct citizen { //Struct to separate all variables
string first;
string last;
string street;
string city;
string state;
string zip;
friend istream& operator>>(istream& input,citizen& r);
bool operator<(const citizen& r) const;
};
istream& operator>>(istream& input,citizen& r){//Read file and move all to struct
string line;
getline(input,line);
stringstream ss(line);
getline(ss,r.first,'|');
getline(ss,r.last,r.street,r.zip,r.city,r.state,'|');
return input;
}
bool citizen::operator<(const citizen& r) const
{
if (state != r.state) return state < r.state;
else
{
if (zip != r.zip) return zip < r.zip;
else
{
if (city != r.city) return city < r.city;
else
{
if (street != r.street) return street < r.street;
else
{
if (first != r.first) return first < r.first;
else
{
if (last != r.last) return last < r.last;
}
}
}
}
}
return false;
}
int main(){
clock_t start,end;
double cpu_time_used;
start = clock();
int count=0;
ifstream input("address100.txt");
vector<citizen> database;
citizen r;
while (input >> r)
{
database.push_back(r);
}
sort(database.begin(),database.end());
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
cout<<cpu_time_used<<endl;;
return 0;
}
解决方法
要打印citizen
的集合,您可以实施:
friend ostream& operator<<(ostream& output,citizen const & r)
{
output << state;
// ... etc
return output;
}
打印citizen
中每个成员变量的位置。
然后您可以像这样打印收藏集:
for(auto const & c : database)
std::cout << c;
正确实施比较的一种更简单的方法是:
bool citizen::operator<(citizen const & r) const
{
return std::tie(state,zip,city,street,first,last)
< std::tie(r.state,r.zip,r.city,r.street,r.first,r.last);
}
从c ++ 20开始,如果根据如何比较成员来排序成员,则可以让编译器为您生成比较:
struct citizen
{
// members in order
string state;
string zip;
string city;
string street;
string first;
string last;
friend istream& operator>>(istream& input,citizen const & r);
// generate all relational operators
auto operator<=>(citizen const &) const = default;
};