我想知道 ptree get 函数是否可以这样调用:
在 JSON 字符串上获取(“字符串”)以返回不可打印的字符?
不能在 (JSON) 字符串上调用 get<std::string>。但是,您可以在ptree 上调用它,当然它可以返回数据。因此,如果该数据包含不可打印的内容,那么它们就在您的数据中。
我使用if (mymap->insert(std::make_pair(str, dat)).second == false){(其中str 是上述get() 函数的结果)来检查现有条目 - 或插入新条目。
这是正确的方法 - 假设您的密钥等价¹确实由 std::less<std::string> 给出。
dat 是与 str 关联的数据结构,如果条目已经存在,则应更新它(在 false 情况下发生)。
在这种情况下,考虑不检查是否存在,而实际上只是更新:
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}
¹弱全序