打印排序的矢量列表

问题描述

最近,我寻求帮助来修复将代码按一定顺序排序然后基于多个变量(如果这些向量相同)进行排序的代码。我有此代码可以工作(我认为),但无法将其打印出来进行检查。就目前而言,这里是代码。我可以确认一切正常,除了排序。因此,我想知道一种检查排序列表的好方法。

#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;  
};

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...