将字符向量解析为 std::map<string, string>

Parse char vector to std::map<string, string>

本文关键字:string 向量 字符 gt lt std map      更新时间:2023-10-16

我有一个unsigned char值的向量。其中的数据是键和值,格式为"key=value"。每一对以一个''字符结尾,最后一对以两个'/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 != ''; env = nxt + 1)
    {
        for (nxt = env; *nxt != ''; ++nxt)
        {
            if (nxt >= &myVector[myVector.size()])
            {
                printf("string not terminatedn");
                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())));
    }

由于密钥不能包含=符号,因此非常容易:

  1. 在零字符上分割(生成所有位置)。
  2. 在第一个=上分割已创建的条目。
  3. 使用生成的区域作为键/值

为了使事情更清楚(比你的双嵌套循环,ew),我将使用一些合理的数据结构来标记缓冲区中的伪字符串(如果你想避免复制),例如pair<unsigned, unsigned>

因此,函数的签名(在这种情况下,我想它比它们的实现更能说明问题)可能看起来像这样:
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)

这些都是相当简化的;我的代码设计OCD告诉我,BufferRange可以是一种不仅携带数字索引的类型,而且还携带对缓冲区本身的引用。