std::映射运算符[]和size()的排序
std::map sequencing of operator[] and size()
我有一个std::map
,并试图用对(name, id)
填充它。id
字段只是从映射的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();
在没有分隔两个调用的序列点的情况下,编译器可以自由地按照自己喜欢的任何顺序计算operator[]
和size()
。不能保证size()
会在operator[]
之前被调用。
将ids[item->name] = item->id = ids.size();
更改为
item->id = ids.size();
ids[item->name] = item->id;
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 大于65535的C++数组[size]引发不一致的溢出
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- std::映射运算符[]和size()的排序
- c++中的快速排序array.size()错误