C++ 混乱的std::映射插入行为

C++ 混乱的std::映射插入行为,c++,insert,map,C++,Insert,Map,在向映射中插入值时,我会出现一些奇怪的行为:我总是在映射的末尾插入值,但有时条目会出现混乱 如果我做了一个直接测试,那么我就不会有问题-数字的顺序是正确的: map<int,int> testMap; for(int i = 0; i < 100; ++i) { // everything is ordered correctly here testMap.insert(testMap.end(), pair<int,int>(i,i)); } m

在向映射中插入值时,我会出现一些奇怪的行为:我总是在映射的末尾插入值,但有时条目会出现混乱

如果我做了一个直接测试,那么我就不会有问题-数字的顺序是正确的:

map<int,int> testMap;
for(int i = 0; i < 100; ++i)
{
    // everything is ordered correctly here
    testMap.insert(testMap.end(), pair<int,int>(i,i));
}
map-testMap;
对于(int i=0;i<100;++i)
{
//这里所有的东西都订对了
insert(testMap.end(),pair(i,i));
}
但是当我解析一个字符串并尝试按照读取值的顺序插入值时,结果就不是那么好了:

const string INPUT_TWO =
"=VAR STRING1 \"MYSTRING\"\n\
=VAR STRING2 \"EXAMPLE\"\n\
=VAR NUMBER1 12345\n\
=VAR NUMBER2 23456\n\
=VAR DUMMY 1111\n";

const string VAL_STRING = "VAR";

vector<pair<string, string>> parse_fields(const string & input)
{
    map<string, string> fieldsMap;
    vector<pair<string, string>> sequenceFields;
    vector<string> lines = split(input, '\n');
    for(size_t i = 0; i < lines.size(); ++i)
    {
        if(lines[i].find(VAL_STRING)!=string::npos)
        {
            vector<string> vals = split(lines[i], ' ');
            if(vals.size()==3)
            {
                fieldsMap.insert(fieldsMap.end(), pair<string,string>(vals[1], remove_quotes(vals[2])));
                sequenceFields.push_back(pair<string,string>(vals[1], remove_quotes(vals[2])));
            }
        }
    }
    
    // at the end the map looks like:
    // "DUMMY", "1111"
    // "NUMBER1", "12345"
    // "NUMBER2", "23456"
    // "STRING1", "MYSTRING"
    // "STRING2", "EXAMPLE"
    
    // the vector of pairs looks like:
    // "STRING1", "MYSTRING"
    // "STRING2", "EXAMPLE"
    // "NUMBER1", "12345"
    // "NUMBER2", "23456"
    // "DUMMY", "1111"
    
    return sequenceFields;
}
const字符串输入\u TWO=
“=VAR STRING1\“MYSTRING\”\n\
=VAR STRING2 \“示例\”\n\
=变量编号12345\n\
=变量编号23456\n\
=VAR DUMMY 1111\n“;
常量字符串VAL_string=“VAR”;
向量解析_字段(常量字符串和输入)
{
地图领域地图;
向量序列域;
矢量线=分割(输入“\n”);
对于(size_t i=0;i
为供参考,我已将所有附加代码粘贴到一个文件中


有人知道为什么会发生这种情况吗?

A
std::map
是一个有序的容器,这使它能够进行查找。如果需要映射和列表,请考虑使用. 贴图不是天生有序的。从概念上讲,它们表示键值对。但是C++ <代码> STD::MAP< /Cord>映射是内部排序的。看见因此,条目将有效地按键值排序


如果需要自己排序,应该使用元组列表。或者一个
无序映射
,如果您有(请参阅;
散列映射
,可能在您的平台上提供)。或者在检索结果时对结果进行排序。

GMan,我刚刚想到了这一点,我正要将int映射从100反转为0,而不是从0反转为100。。。所以现在一切都有意义了。