#include <iostream>
#include <map>
#include <string>
#include <vector>

int main() {
    std::string str("0=My,1=comma,2=separated,3=string,0=with,3=repeated,7=IDs");
    std::vector<std::string> out0;
    std::map<std::string, std::string> out;

    size_t startPos = 0, delimPos, nameStart, nameEnd, valueStart, valueEnd;

    // loop over the string, collecting "key=value" pairs
    while (startPos < str.size()){
        nameStart = startPos;
        delimPos = str.find_first_of("=,", startPos, 2);
        if (delimPos == std::string::npos) {
            nameEnd = valueStart = valueEnd = str.size();
        }
        else {
            nameEnd = delimPos;
            if (str[delimPos] == '=') {
                valueStart = nameEnd + 1;
                valueEnd = str.find(',', valueStart);
                if (valueEnd == std::string::npos) {
                    valueEnd = str.size();
                }
            }
            else {
                valueStart = valueEnd = nameEnd;
            }
        }

        // TODO: if needed, adjust nameStart/End and valueStartEnd to
        // ignore leading/trailing whitespace around the name and value
        // substrings...

        if (str.compare(nameStart, nameEnd - nameStart, "0", 1) == 0) {
            out0.push_back(str.substr(valueStart, valueEnd - valueStart));
        } else {
            out[str.substr(nameStart, nameEnd - nameStart)] = str.substr(valueStart, valueEnd - valueStart);
        }

        startPos = valueEnd + 1;
    }

    // print out the data structures
    std::cout << "out0:";
    for (auto& entry : out0) {
        std::cout << ' ' << entry;
    }
    std::cout << std::endl;

    std::cout << "out:";
    for (auto &it : out) {
        std::cout << ' ' << it.first << '=' << it.second;
    }
}
