我有一个unsigned char
值的向量。里面的数据是键和值,格式为" key = value"。每对由'\0'
字符终止,最后一对由双'/0'
终止。值可以包含" ="同样,这个分隔符不应该是该对的标准,只有终止'\0'
从单个unsigned char
的这个向量我想得到一个std::map<std::string, std::string>
对象。
什么是通过矢量并填充地图的有效方法?
提前谢谢!
此代码找到所有对,但是在打印它们时,我的控制台似乎搞砸了,所以我怀疑无效字符......也许这与我使用unsigned char
的事实有关?
unsigned char *env, *nxt;
std::string delimiter = "=";
std::string line;
std::map<string, string> myMap;
for (env = &myVector[0]; *env != '\0'; env = nxt + 1)
{
for (nxt = env; *nxt != '\0'; ++nxt)
{
if (nxt >= &myVector[myVector.size()])
{
printf("string not terminated\n");
return -1;
}
}
line = std::string(env, env + myVector.size());
myMap.insert(std::pair<string, string>(
line.substr(0, line.find(delimiter)),
line.substr(line.find(delimiter) + 1, line.size())));
}
答案 0 :(得分:1)
由于密钥不能包含=
符号,因此非常简单:
=
上拆分创建的条目。为了使事情更清晰(比你的双嵌套循环,ew),我使用一些合理的数据结构来标记缓冲区中的虚拟字符串(如果你想避免复制),例如{{1 }}
因此,我认为函数的签名(在这种情况下,它们的实现比我们的实现更多)可能如下所示:
pair<unsigned, unsigned>
那些相当简单;我的代码设计OCD告诉我using BufferRange = pair<unsigned, unsigned>;
using BufferEntry = pair<BufferRange, BufferRange>;
list<BufferRange> splitOnZeroes(Buffer const& b);
BufferEntry splitOnEquality(BufferRange const& br, Buffer const& b);
void addToMap(map<string, string>& m, BufferEntry const& p)
可以是一个不仅包含数字索引的类型,还包含对缓冲区本身的引用。将其(如果需要)更改为练习。