C++ 垃圾场地图<;字符串,字符串>;到字符向量

C++ 垃圾场地图<;字符串,字符串>;到字符向量,c++,string,vector,C++,String,Vector,我有一个映射,我想转储到一个字符数组中。 该数组应如下所示: key1=value\0key2=value2\0key3=value3\0\0 每个映射键后面应紧跟'='、值和终止的NUL字符 我的方法会产生垃圾: char* pChar = &data[0]; std::vector<char> writable; string key; string value; for (std::map<std::string, std::string>::const

我有一个映射,我想转储到一个字符数组中。 该数组应如下所示:

key1=value\0key2=value2\0key3=value3\0\0
每个
映射
键后面应紧跟
'='
、值和终止的
NUL
字符

我的方法会产生垃圾:

char* pChar = &data[0];
std::vector<char> writable;
string key;
string value;

for (std::map<std::string, std::string>::const_iterator iter = myMap.begin(); iter != myMap.end(); iter++)
{
    writable.resize( iter->first.size()  + iter->second.size() + 2);
    key = iter->first;
    value = iter->second;
    memcpy(&writable[0], &key, key.length());
    std::fill(writable.begin() +  key.length(), writable.begin() +  key.length(), 0x3D );
    memcpy(&writable[key.length() + 1], &value,  value.length());
    std::fill(writable.begin() +  key.length() + value.length() + 1, writable.begin() + key.length() + value.length() + 1, 0x0 );
    memcpy(pChar, &writable[0], writable.size());
    pChar += writable.size();
}
memset(pChar, 0, 1);
char*pChar=&data[0];
std::向量可写;
字符串键;
字符串值;
对于(std::map::const_迭代器iter=myMap.begin();iter!=myMap.end();iter++)
{
可写.resize(iter->first.size()+iter->second.size()+2);
键=国际热核实验堆->第一;
数值=国际热核实验堆->秒;
memcpy(&writable[0],&key,key.length());
std::fill(writable.begin()+key.length(),writable.begin()+key.length(),0x3D);
memcpy(&writable[key.length()+1],&value,value.length());
std::fill(writable.begin()+key.length()+value.length()+1,writable.begin()+key.length()+value.length()+1,0x0);
memcpy(pChar,&writeable[0],writeable.size());
pChar+=writable.size();
}
memset(pChar,0,1);

您正在使用
memcpy
从std::string的地址复制。如果要从
key.c_str()
value.c_str()
中的字符串内容复制,则标准字符序列容器是
std::string
,您的代码可以缩减为:

int main() {
    std::map<std::string, std::string> m = { 
        { "k0" , "v0" } ,
        { "k1" , "v1" },
        { "k2" , "v2" }, 
        { "k3" , "v3" } 
    };

    std::string result;

    for(auto& pair : m)
        result += pair.first + "=" + pair.second + " ";

    std::cout << result;
}
当然,您可以使用
c_str()
member函数获取底层的c-stye数组


编辑:

如果您确实希望使用NUL字符作为分隔符的
std::vector
,则可以使用
std::copy
std::back\u插入器

std::vector<char> result;

for(auto& pair : m)
{
   std::copy(pair.first.begin(), pair.first.end(), std::back_inserter(result));
   std::copy(pair.second.begin(), pair.second.end(), std::back_inserter(result));
   result.push_back('\0');
}
std::向量结果;
用于(自动配对:m)
{
std::copy(pair.first.begin()、pair.first.end()、std::back_inserter(result));
std::copy(pair.second.begin()、pair.second.end()、std::back_插入器(result));
结果。推回('\0');
}

为什么
向量
而不是
字符串
?这里不需要memcpy和memset。谢谢,这实际上更有意义。只需连接字符串,然后获取已具有终止NUL的
c_str()
,并将其复制到
pChar
,这不会像OP希望的那样使用
NUL
\0
)字符。
std::vector<char> result;

for(auto& pair : m)
{
   std::copy(pair.first.begin(), pair.first.end(), std::back_inserter(result));
   std::copy(pair.second.begin(), pair.second.end(), std::back_inserter(result));
   result.push_back('\0');
}