Commit b30744b44c00b4dcfe9deb015a974d21951bcb32

Authored by Grzegorz Jabłoński
1 parent f107c09e

Unordered_set with closure as a hash function

examples09/07-closures/employee.h 0 → 100644
  1 +#ifndef __EMPLOYEE_H__
  2 +#define __EMPLOYEE_H__
  3 +#include <string>
  4 +#include <iostream>
  5 +
  6 +struct Employee
  7 +{
  8 + std::string FirstName, LastName, ID;
  9 + Employee (const std::string & fn, const std::string & ln,
  10 + const std::string & I):FirstName (fn), LastName (ln), ID (I)
  11 + {
  12 + };
  13 + friend std::ostream& operator<< (std::ostream & o, const Employee & e)
  14 + {
  15 + o << e.FirstName << " " << e.LastName << " " << e.ID;
  16 + return o;
  17 + };
  18 +
  19 + bool operator==(const Employee& o) const
  20 + {
  21 + return (FirstName == o.FirstName) && (LastName == o.LastName) && (ID == o.ID);
  22 + }
  23 +};
  24 +#endif /* __EMPLOYEE_H__ */
examples09/07-closures/makefile
1 -all: fun1 fun2 fun3 fun4 fun5 1 +all: fun1 fun2 fun3 fun4 fun5 unordered_set3
2 2
3 fun1: fun1.o 3 fun1: fun1.o
4 g++ -g -Wall $^ -o $@ 4 g++ -g -Wall $^ -o $@
@@ -30,7 +30,14 @@ fun5.o: fun5.cpp @@ -30,7 +30,14 @@ fun5.o: fun5.cpp
30 fun5: fun5.o 30 fun5: fun5.o
31 g++ -g -Wall $^ -o $@ 31 g++ -g -Wall $^ -o $@
32 32
  33 +
  34 +unordered_set3.o: unordered_set3.cpp
  35 + g++ -std=c++2a -g -c -Wall $< -o $@
  36 +
  37 +unordered_set3: unordered_set3.o
  38 + g++ -g -Wall $^ -o $@
  39 +
33 .PHONY: clean 40 .PHONY: clean
34 41
35 clean: 42 clean:
36 - -rm fun1.o fun1 fun2.o fun2 fun3.o fun3 fun4.o fun4 fun5.o fun5  
37 \ No newline at end of file 43 \ No newline at end of file
  44 + -rm fun1.o fun1 fun2.o fun2 fun3.o fun3 fun4.o fun4 fun5.o fun5 unordered_set3.o unordered_set3
38 \ No newline at end of file 45 \ No newline at end of file
examples09/07-closures/unordered_set3.cpp 0 → 100644
  1 +#include <functional>
  2 +#include <unordered_set>
  3 +using namespace std;
  4 +#include "employee.h"
  5 +
  6 +int main() {
  7 + Employee Ben("Ben", "Keller", "000-00-0000");
  8 + Employee Bill("Bill", "McQuain", "111-11-1111");
  9 + Employee Dwight("Dwight", "Barnette", "888-88-8888");
  10 +
  11 + auto empHash = [](const Employee &o) {
  12 + return std::hash<std::string>()(o.FirstName) ^
  13 + (std::hash<std::string>()(o.LastName) << 1) ^
  14 + (std::hash<std::string>()(o.ID) << 2);
  15 + };
  16 +
  17 + unordered_set<Employee, decltype(empHash)> S;
  18 + S.insert(Bill);
  19 + S.insert(Dwight);
  20 + S.insert(Ben);
  21 +
  22 + for (auto i : S)
  23 + cout << i << endl;
  24 +}