我有一个 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/