日記

内容の正しさは保証しません

ノート 18/5/7

1.std::stringで文字列を検索して全部置換する方法

C++ 文字列の置換/全置換【replace/replace_first/replace_all|std::string】 | MaryCore

std::string s = "a, b, c"; // 置換対象の文字列

std::string target = ", "; // 検索文字列

std::string replacement = "-"; // 置換文字列

if (!target.empty()) {

std::string::size_type pos = 0;

while *1 != std::string::npos)

{

s.replace(pos, target.length(), replacement);

pos += replacement.length();

}

}

 

2.templateの特殊化は外で行う

//T.hpp

struct T

{

    template <class X> X f();

 

//コンパイル エラー

//  template <> int f() { return 1; }

};

 //こちらが正しい

template <> int f() { return 1; }

 

3. 関数の後ろに アロー(->) がついてる書き方

戻り値を指定する書き方の1つ

template <class T> auto f() -> T { }

 

4. テンプレート・テンプレート

std::vector<T>とTを受け取りたい時の書き方

template <template <class> class S, class T> f();

 

f<std::vector<int>>();

//ちょっと自信ないので後で検証する

 

5. jsonのパース

picojsonとjson11を使ってみた.

picojsonは数値=doubleなので、キャストが面倒くさい

それからjsonを生成する処理が冗長

using o = picojson::object;

using v = picojson::value;

 

int id = 12345;

o j;

j.insert({"id", v(static_cast<double>(id))});

既に括弧地獄で意味不明.

 

もう1つ.配列が面倒くさい

parseの際に1つ1つ取り出すのは仕方ないが、json生成のときに1つ1つvalueに変換してarrayに格納しなければならずいらいらする.

 

json11

上記のうるさいコードを書かずに済むみたい.

 

//test.json

{

    "data": [

        {

            "id": 123,

            "name": "aiu";

        },

        {

        //省略

        }

    ]

}

 

//std::string srcはjsonファイルの中身

std::string err;

json11::Json json = json11::Json::parse(src, err);

for (auto& e : json["data"].array_items) {

    std::cout << e["id"].int_value() << std::endl;

}

このように取り出す

 

json生成

using object = json11::Json::object;

using array = json11::Json::array;

json11::Json json = object {

    {"data",

        array {

            object {

                {"id", 123},

                {"name", "asdf"}

             },

             object {

                //略

              }

        }

    }

};

 

6.std::stringと数値の変換

std::string s = std::to_string(12345);

 

#include <sstream>

#include <type_traits>

V v;

std::stringstream s;

std::string src;

if (std::is_integral<V>() || std::is_floating_point<V>()) {

    s << src;

    s >> v;

}

 

//コードの貼り方が分からない

//気が向いたら調べます

できたっぽいです.次の記事から反映されます

*1:pos = s.find(target, pos