Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cpp #67

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open

Cpp #67

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions week0004/HaiHa/cpp/PrintOutDuplicateInfo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#include <algorithm>
#include <fstream>
#include <iostream>
#include <set>
#include <regex>

class Participant
{

public:
Participant (std::string firstName, std::string lastName, std::string email) :
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inefficient: Use const references! const std::string&

m_firstName(firstName),
m_lastName(lastName),
m_email(email)
{
}

bool operator< (const Participant &rhs) const
{
if (m_firstName != rhs.m_firstName)
return (m_firstName < rhs.m_firstName);
else if (m_lastName != rhs.m_lastName)
return (m_lastName < rhs.m_lastName);
else
return (m_email < rhs.m_email);
}

friend std::ostream & operator<<(std::ostream &out, Participant input)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent spacing:

operator< (
operator<<(

Copy link
Member

@vietlq vietlq Oct 30, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you treat this function as a friend, you don't need to keep its implementation inside the class. Recommended idiom for larger projects:

class A
{
  int data;
public:
  void print(std::ostream& ostr)
  {
    ostr << "Data: " << data;
  }
};

std::ostream& operator<<(std::ostream& ostr, const A& a)
{
 a.print(ostr);
 return ostr;
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also I generally don't recommend having friends in C++ ;)

{
return out << input.m_firstName << " " << input.m_lastName << " <" <<
input.m_email << ">";
}

private:
std::string m_firstName;
std::string m_lastName;
std::string m_email;
};

typedef std::set<Participant> SortedParticipantList;

//------------------------------------------------------------------------------

/**Parse a line and add it to the participant list**/
void ParseParticipantInformation(const std::string &line, SortedParticipantList
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's recommended to have function names start with lowercase.

&ParticipantList, const std::regex &pattern)
{
std::smatch match;

if ((std::regex_match(line, match,pattern)) && (match.size() == 4))
ParticipantList.emplace(match[1], match[2], match[3]);
}

//------------------------------------------------------------------------------

/** Get participant list from input file**/
Copy link
Member

@vietlq vietlq Oct 30, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better way to comment:

/**
 * @brief: Get participant list from input file
 */

void GetParticipantListFromFile(const std::string &fileName, SortedParticipantList &ParticipantList)
{
std::ifstream inputStream(fileName);
std::string line;

if(!inputStream)
{
std::cout << "Cannot open input file.\n";
}
else
{
//Ignore the first line as title.
std::getline(inputStream, line);

const std::regex pattern("(\\w+),(\\w++),([A-z0-9._%+-]+@\\w+\\.\\w+)");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this match names like O'Reilly or van Derks? I don't think so.


while (std::getline(inputStream, line))
ParseParticipantInformation(line, ParticipantList, pattern);

inputStream.close();
}
}

//------------------------------------------------------------------------------

void PrintOutIntersectionForSets(const SortedParticipantList &list1, const SortedParticipantList &list2)
{
std::set_intersection(list1.begin(), list1.end(), list2.begin(), list2.end(),
std::ostream_iterator<Participant>(std::cout, "\n"));
}


int main(int argc, char *argv[])
{
SortedParticipantList eventA;
SortedParticipantList eventB;

// Get file names from command line
GetParticipantListFromFile(argv[1], eventA);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You didn't check if argc == 3

GetParticipantListFromFile(argv[2], eventB);

PrintOutIntersectionForSets(eventA, eventB);

return 0;
}