{"id":583,"date":"2019-09-12T21:51:06","date_gmt":"2019-09-13T04:51:06","guid":{"rendered":"http:\/\/35.243.195.209\/?page_id=583"},"modified":"2020-06-16T21:09:16","modified_gmt":"2020-06-17T04:09:16","slug":"c","status":"publish","type":"page","link":"https:\/\/nanzhou.cc\/index.php\/snippets\/c\/","title":{"rendered":"C++ Language"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">FileReader<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">class FileReader {\nprivate:\n    fstream file;\npublic:\n    FileReader(string const &amp; file_dir) {\n        file = fstream(file_dir);\n        if (!file.is_open()) {\n            throw runtime_error(\"Can not open file\");\n        }\n    }\n    bool get_line(string &amp; next_line) {\n        return !!getline(file, next_line);\n    }\n};<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Split<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">vector&lt;string> split(string const &amp; s, char delimiter)\n{\n   vector&lt;std::string> tokens;\n   string token;\n   stringstream tokenStream(s);\n   # note that: \"123.\".split('.') => {\"123\"} not {\"123\", \"\"}\n   while (getline(tokenStream, token, delimiter))\n   {\n      tokens.push_back(token);\n   }\n   return tokens;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Explicit vs Implicit Constructor<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">struct A\n{\n    A(int) { }      \/\/ converting constructor\n    A(int, int) { } \/\/ converting constructor (C++11)\n    operator bool() const { return true; }\n};\n \nstruct B\n{\n    explicit B(int) { }\n    explicit B(int, int) { }\n    explicit operator bool() const { return true; }\n};\n \nint main()\n{\n    A a1 = 1;      \/\/ OK: copy-initialization selects A::A(int)\n    A a2(2);       \/\/ OK: direct-initialization selects A::A(int)\n    A a3 {4, 5};   \/\/ OK: direct-list-initialization selects A::A(int, int)\n    A a4 = {4, 5}; \/\/ OK: copy-list-initialization selects A::A(int, int)\n    A a5 = (A)1;   \/\/ OK: explicit cast performs static_cast\n    if (a1) ;      \/\/ OK: A::operator bool()\n    bool na1 = a1; \/\/ OK: copy-initialization selects A::operator bool()\n    bool na2 = static_cast&lt;bool>(a1); \/\/ OK: static_cast performs direct-initialization\n \n\/\/  B b1 = 1;      \/\/ error: copy-initialization does not consider B::B(int)\n    B b2(2);       \/\/ OK: direct-initialization selects B::B(int)\n    B b3 {4, 5};   \/\/ OK: direct-list-initialization selects B::B(int, int)\n\/\/  B b4 = {4, 5}; \/\/ error: copy-list-initialization does not consider B::B(int,int)\n    B b5 = (B)1;   \/\/ OK: explicit cast performs static_cast\n    if (b2) ;      \/\/ OK: B::operator bool()\n\/\/  bool nb1 = b2; \/\/ error: copy-initialization does not consider B::operator bool()\n    bool nb2 = static_cast&lt;bool>(b2); \/\/ OK: static_cast performs direct-initialization\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Custom Hash<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">class Solution {\npublic:\n    class Position {\n    public:\n        int s_x, s_y;\n        int b_x, b_y;\n        Position(int s_x_, int s_y_, int b_x_, int b_y_) : s_x(s_x_), s_y(s_y_), b_x(b_x_), b_y(b_y_) {}\n        \/\/ must override operator == to handle hash conflict\n        bool operator == (Position const &amp;another) const {\n            return s_x == another.s_x &amp;&amp; s_y == another.s_y &amp;&amp; b_x == another.b_x &amp;&amp; b_y == another.b_y;\n        }\n    };\n    \n    class PositionHash {\n    public:\n        \/\/ lazy solution, use built-in std::hash&lt;T>()\n        size_t operator() (Position const &amp;p) const {\n            return hash&lt;string>()(to_string(p.s_x) + \",\" + to_string(p.s_y) + \",\" + to_string(p.b_x) + \",\" + to_string(p.b_y));\n        }\n    };\n\n    class PeopleHash {\n    public:\n        size_t operator() (Position const &amp;p) const {\n            return (p.s_x + 1) * 100 + p.s_y;\n        }\n    };\n\n    class BoxHash {\n    public:\n        size_t operator() (Position const &amp;p) const {\n            return (p.b_x + 1) * 100 + p.b_y;\n        }\n    };\n\n    void example() {\n        unordered_set&lt;Position, BoxHash> visited;\n    }\n};<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Unique Pointers to Shared Pointers <\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">\/\/In short, you can easily and efficiently convert a std::unique_ptr to std::shared_ptr but you cannot convert std::shared_ptr to std::unique_ptr.\n\nstd::unique_ptr&lt;std::string> unique = std::make_unique&lt;std::string>(\"test\");\nstd::shared_ptr&lt;std::string> shared = std::move(unique);\n\/\/ or\nstd::shared_ptr&lt;std::string> shared = std::make_unique&lt;std::string>(\"test\");<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">String View<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">string text_ = \"Hello World\";\nstring_view text(text_);\ncout &lt;&lt; text.substr(0, 5) &lt;&lt; endl; \/\/ substr is O(1)\nreturn 0;<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>FileReader Split Explicit vs Implicit Constructor Custom Hash Unique Pointers to Shared Pointers String View<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":452,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-583","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/pages\/583","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/comments?post=583"}],"version-history":[{"count":12,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/pages\/583\/revisions"}],"predecessor-version":[{"id":1354,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/pages\/583\/revisions\/1354"}],"up":[{"embeddable":true,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/pages\/452"}],"wp:attachment":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/media?parent=583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}