// kjellkod playing with temporary objects.
// From Herb's Gotw: http://h...content-available-to-author-only...r.com/2013/05/09/gotw-2-temporary-objects-510/
//
// Cheers
// KjellKod (.wordpress.com)
#include <iterator>
#include <list>
#include <string>
#include <iostream>
using namespace std;
// no explicit keyword makes the implicit conversion possible. which can be avoided of course
// with explicit employee(string str) ...
struct employee {
string addr;
employee(std::string str) : addr{str}{} // oops no explicit
bool operator==(const employee& other) const { return (addr.compare(other.addr) == 0); }
};
// using unnecessary copies. Possible scenario if employee is created as above
// 1) i++ (probably close to zero overhead?)
// 2) == operator implicit conversion from string to employee
// 3) return value can be written {""}
// 4) const reference to the arguments
// 5) why not just use for(auto& employee : emps) instead of for(begin, !=end, ++) to avoid temp iterators
//
string find_addr( list<employee> emps, string name ) { // 4
for( auto i = begin(emps); i != end(emps); i++ ) { // 1, 5
if( *i == name ) { // 2
return i->addr;
}
}
return ""; // 3
}
string find_addr_improved( const list<employee>& emps, const string& name ) {
for(auto& employee : emps) {
if ( employee.addr == name) return employee.addr;
}
return {""};
}
int main() {
auto colleagues = list<employee>{{"Kjell"}, {"Jeanine"}, {"Nathaniel"}, {"John"}};
cout << find_addr(colleagues, {"Jeanine"}) << endl;
cout << find_addr_improved(colleagues, {"Kjell"}) << endl;
return 0;
}
Ly8ga2plbGxrb2QgcGxheWluZyB3aXRoIHRlbXBvcmFyeSBvYmplY3RzLiAKLy8gRnJvbSBIZXJiJ3MgR290dzogaHR0cDovL2guLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnIuY29tLzIwMTMvMDUvMDkvZ290dy0yLXRlbXBvcmFyeS1vYmplY3RzLTUxMC8KLy8KLy8gQ2hlZXJzCi8vIEtqZWxsS29kICgud29yZHByZXNzLmNvbSkKCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBubyBleHBsaWNpdCBrZXl3b3JkIG1ha2VzIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHBvc3NpYmxlLiB3aGljaCBjYW4gYmUgYXZvaWRlZCBvZiBjb3Vyc2UKLy8gd2l0aCBleHBsaWNpdCBlbXBsb3llZShzdHJpbmcgc3RyKSAuLi4Kc3RydWN0IGVtcGxveWVlIHsKICAgc3RyaW5nIGFkZHI7CgogIGVtcGxveWVlKHN0ZDo6c3RyaW5nIHN0cikgOiBhZGRye3N0cn17fSAvLyBvb3BzIG5vIGV4cGxpY2l0CiAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVtcGxveWVlJiBvdGhlcikgY29uc3QgeyByZXR1cm4gKGFkZHIuY29tcGFyZShvdGhlci5hZGRyKSA9PSAwKTsgfQp9OwoKCgovLyB1c2luZyB1bm5lY2Vzc2FyeSBjb3BpZXMuIFBvc3NpYmxlIHNjZW5hcmlvIGlmIGVtcGxveWVlIGlzIGNyZWF0ZWQgYXMgYWJvdmUKLy8gMSkgaSsrICAgKHByb2JhYmx5IGNsb3NlIHRvIHplcm8gb3ZlcmhlYWQ/KQovLyAyKSA9PSBvcGVyYXRvciAgaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIHN0cmluZyB0byBlbXBsb3llZQovLyAzKSByZXR1cm4gdmFsdWUgY2FuIGJlIHdyaXR0ZW4geyIifQovLyA0KSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGFyZ3VtZW50cyAKLy8gNSkgd2h5IG5vdCBqdXN0IHVzZSBmb3IoYXV0byYgZW1wbG95ZWUgOiBlbXBzKSBpbnN0ZWFkIG9mIGZvcihiZWdpbiwgIT1lbmQsICsrKSB0byBhdm9pZCB0ZW1wIGl0ZXJhdG9ycwovLwpzdHJpbmcgZmluZF9hZGRyKCBsaXN0PGVtcGxveWVlPiBlbXBzLCBzdHJpbmcgbmFtZSApIHsgIC8vIDQgCiAgICBmb3IoIGF1dG8gaSA9IGJlZ2luKGVtcHMpOyBpICE9IGVuZChlbXBzKTsgaSsrICkgeyAgLy8gMSwgNQogICAgICAgIGlmKCAqaSA9PSBuYW1lICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKICAgICAgICAgICAgcmV0dXJuIGktPmFkZHI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMKfQoKCnN0cmluZyBmaW5kX2FkZHJfaW1wcm92ZWQoIGNvbnN0IGxpc3Q8ZW1wbG95ZWU+JiBlbXBzLCBjb25zdCBzdHJpbmcmIG5hbWUgKSB7IAogICAgICBmb3IoYXV0byYgZW1wbG95ZWUgOiBlbXBzKSB7ICAKICAgICAgICBpZiAoIGVtcGxveWVlLmFkZHIgPT0gbmFtZSkgICAgIHJldHVybiBlbXBsb3llZS5hZGRyOwogICAgfQogICAgcmV0dXJuIHsiIn07ICAgCn0KCmludCBtYWluKCkgewogICAgYXV0byBjb2xsZWFndWVzID0gbGlzdDxlbXBsb3llZT57eyJLamVsbCJ9LCB7IkplYW5pbmUifSwgeyJOYXRoYW5pZWwifSwgeyJKb2huIn19OyAKCiAgICBjb3V0IDw8IGZpbmRfYWRkcihjb2xsZWFndWVzLCB7IkplYW5pbmUifSkgPDwgZW5kbDsKICAgIGNvdXQgPDwgZmluZF9hZGRyX2ltcHJvdmVkKGNvbGxlYWd1ZXMsIHsiS2plbGwifSkgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKICAgIAp9