Boost ptree get <std :: string> () возвращает непечатаемые символы? - PullRequest
0 голосов
/ 29 июня 2018

Мне было интересно, возможно ли для функции ptree get вызываться так:
get<std::string>("string") в строке JSON для возврата непечатаемых символов? И если да, то как лучше отфильтровать их?
Проблема, с которой я сталкиваюсь, заключается в том, что я вставляю строки в std::map, и каждый последующий экземпляр должен просто обновлять исходную запись, но в результате получается несколько записей в конце.

Я использую if (mymap->insert(std::make_pair(str, dat)).second == false){ (где str - это то, что выходит из вышеупомянутой функции get()), чтобы проверить существующие записи - или вставить новую.
dat - это структура данных, связанных с str, которые должны быть обновлены, если запись уже существует (что происходит в случае false).

1 Ответ

0 голосов
/ 29 июня 2018

Мне было интересно, возможно ли для функции ptree get вызываться так: get ("string") в строке JSON для возврата непечатаемых символов?

Невозможно вызвать get<std::string> для строки (JSON). Вы можете , однако позвоните по номеру ptree и, конечно, он может вернуть данные. Так что, если эти данные содержат непечатаемые, то они в ваших данных.

Я использую if (mymap->insert(std::make_pair(str, dat)).second == false){ (где str - это то, что выходит из вышеуказанной функции get()), чтобы проверить существующие записи - или вставить новую.

Это правильный путь - при условии, что эквивалентность ваших ключей¹ действительно дается std::less<std::string>.

dat - это структура данных, связанных с str, которая должна быть обновлена, если запись уже существует (что происходит в ложном случае).

В этом случае рассмотрим не проверку на существование, а просто обновление:

 mymap[str] = dat;

Это автоматически вставит новый элемент, если ключ еще не был там. Обратите внимание, что это не изменит поведение клавиш.

Демо

Упростите, чтобы проверить ваше понимание:

Live On Coliru

#include <map>
#include <string>
#include <iostream>
#include <iomanip>

struct dat {
    int i, j, k;
};

static inline std::ostream& operator<<(std::ostream& os, dat const& d) {
    return os << "{" << d.i << "," << d.j << "," << d.k << "}";
}

using Map = std::map<std::string, dat>;

void dump(Map const& m) {
    std::cout << " --- Map: \n";
    for (auto& entry : m) {
        std::cout << std::quoted(entry.first) << " -> " << entry.second << "\n";
    }
}

int main() {
    Map mymap {
        { "one", {1,2,3} },
        { "two", {2,4,6} },
        { "three", {3,6,9} },
    };

    dump(mymap);

    mymap["four"] = {4,8,12}; // adds
    dump(mymap);

    mymap["three"] = {0,0,0}; // overwrites
    dump(mymap);

    mymap["three "] = {-1,-1,-1}; // adds new key
    dump(mymap);
}

печать

 --- Map: 
"one" -> {1,2,3}
"three" -> {3,6,9}
"two" -> {2,4,6}
 --- Map: 
"four" -> {4,8,12}
"one" -> {1,2,3}
"three" -> {3,6,9}
"two" -> {2,4,6}
 --- Map: 
"four" -> {4,8,12}
"one" -> {1,2,3}
"three" -> {0,0,0}
"two" -> {2,4,6}
 --- Map: 
"four" -> {4,8,12}
"one" -> {1,2,3}
"three" -> {0,0,0}
"three " -> {-1,-1,-1}
"two" -> {2,4,6}

¹ слабый общий порядок

...