c++ - std::map 运算符 [] 和 size() 的排序

标签 c++ map stl

我有一个 std::map 并试图用 (name, id) 对填充它。 id 字段只是从 map 的 size() 生成的。这是一个简化版本:

#include <iostream>
#include <map>

struct A {
    std::string name;
    int id;
    A(const std::string &s) : name(s), id(-1) { }
};

class Database {
    std::map<std::string, int> ids;
public:
    void insert(A *item) {
        ids[item->name] = item->id = ids.size();
    }
    void dump() const {
        for (std::map<std::string, int>::const_iterator i = ids.begin(); i != ids.end(); i++)
            std::cout << i->second << ". " << i->first << std::endl;
    }
};

int main(int argc, char **agrv) {
    A a("Test");
    Database db;
    db.insert(&a);
    db.dump();
    return 0;
}

问题在于不同的编译器对 ids[item->name] = item->id = ids.size() 部分的处理方式不同。 Clang++ 产生

item->id = ids.size(); // First item gets 0
ids[item->name] = item->id;

当 g++ 做类似的事情时

ids.insert(std::pair<std::string, int>(item->name, 0));
item->id = ids.size(); // First item gets 1
ids[item->name] = item->id;

那么,这段代码是有效的(从 STL 的角度来看)还是像 i =++i+++i 一样邪恶?

最佳答案

ids[item->name] = item->id = ids.size();

没有 sequence point将这两个调用分开,编译器可以按照它喜欢的任何顺序自由计算 operator[]size()。无法保证 size() 会在 operator[] 之前被调用。

关于c++ - std::map 运算符 [] 和 size() 的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17997790/

相关文章:

hibernate - Grails 从 Hibernate XML 到 GORM 的转换

一个值可以包含两个或多个键的 Java Map 类

c++ - 将成员函数作为标准函数回调传递

c++ - 为什么我们需要定义一个类的静态变量,而函数内部却不定义静态变量?

c++ - 错误 C2440 : 'return' : cannot convert. 适用于 vs140,141 但不适用于 vs142

javascript - 如何更改 Cesium map 中 EllipseOutlineGeometry 的宽度?

c++ - 将指针容器作为参数传递给 const

c++ - 从 vector<derived>::iterator 转换为 vector<base>::iterator

c++ - 为什么 C++ 标准库中没有 SIMD 功能?

java - 社交网络架构、C++ Clients Neo4j 数据库之间有什么关系?