转储映射<字符串、字符串>到字符向量

Dump map<string, string> to char vector

本文关键字:字符串 字符 向量 gt 映射 转储 lt      更新时间:2023-10-16

我有一个映射,我想转储到一个字符数组。数组应该是这样的:

key1=valuekey2=value2key3=value3

每个map键后跟'='、值和结束的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);

标准字符序列容器是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;
}

如果你真的需要,你可以很容易地从string中获得std::vector<char>:

std::vector<char> v(result.begin(), result.end());

当然,您可以使用c_str()成员函数获得底层的c风格数组。


编辑:

如果你真的想要一个带有NUL字符作为分隔符的std::vector<char>,你可以使用std::copystd::back_inserter:

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('');
}

您正在使用memcpy从std::string的地址复制进来。您希望从key.c_str()value.c_str()中字符串的内容复制进来。