c_str和data函数区别 rapidjson设置字符串 rapidjson深度复制

2016-06-01 20:59:00
admin
原创 4077
摘要:c_str和data函数区别 rapidjson设置字符串 rapidjson深度复制

一、c_str和data函数区别

函数申明:

const char* c_str() const;

const char* data() const;


函数区别:

c_str保证字符串以0结尾;

data不保证字符串以0结尾;


实际情况:

c_strdata返回一致;


二、rapidjson设置字符串

1、SetValue、AddMember、PushBack不进行深度复制,除非带分配器参数进行调用

2、rapidjson赋值时转移对象保证了高效,但是使用时产生的内存问题需要注意;

3、默认版本的内存分配器在整个分配器析构时释放内存;


void modifyString()
{
const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
Document d;
char *s;
d.Parse(json);
d["project"] = "json1";
cout << d["project"].GetString() << endl;

s = "json2";
d["project"].SetString(s, strlen(s));
cout << d["project"].GetString() << endl;

s = "json3";
d["project"].SetString(StringRef(s));
cout << d["project"].GetString() << endl;
}


三、rapidjson深度复制

void copyString()
{
Document doc;
Value str, copyDoc;
Document::AllocatorType &alloc = doc.GetAllocator();

char data[] = "feinen";
str.SetString(data, alloc);
doc.SetObject();
doc.AddMember("name", str, alloc);
copyDoc.CopyFrom(doc, alloc);

((char *)(doc["name"].GetString()))[0] = 'x';
cout << doc["name"].GetString() << endl;
cout << copyDoc["name"].GetString() << endl;
}

四、AddMemer和FindMemer函数

1、rapidjson内部实现是数组,AddMemer在末尾添加新元素,不存在去重和失败;

2、FindMemer利用循环遍历寻找元素,可能会找到错误的元素;

发表评论
评论通过审核之后才会显示。