草庐IT

binary-arithmetic-operations

全部标签

c++ 将 find() 映射到可能的 insert() : how to optimize operations?

我正在使用STLmap数据结构,此时我的代码首先调用find():如果该键以前不在map中,它会调用insert()它,否则它什么也不做。map::iteratorit;it=my_map.find(foo_obj);//1stlookupif(it==my_map.end()){my_map[foo_obj]="somevalue";//2ndlookup}else{//okdonothing.}我想知道是否有比这更好的方法,因为据我所知,在这种情况下,当我想插入一个还不存在的键时,我会在map数据结构中执行2次查找:一次对于find(),insert()中的一个(对应于operat

c++ - 为什么非常量 std::array::operator[] 不是 constexpr?

我正在尝试使用给定函数在编译时填充二维数组。这是我的代码:templatestructTable{intdata[H][W];//std::array,W>data;//ThisdoesnotworkconstexprTable():data{}{for(inti=0;itable;//Ihavetable.dataproperlypopulatedatcompiletime它工作得很好,table.data在编译时正确填充。但是,如果我更改纯二维数组int[H][W]与std::array,W>,我在循环体中有错误:error:calltonon-constexprfunction'

c++ - 为什么非常量 std::array::operator[] 不是 constexpr?

我正在尝试使用给定函数在编译时填充二维数组。这是我的代码:templatestructTable{intdata[H][W];//std::array,W>data;//ThisdoesnotworkconstexprTable():data{}{for(inti=0;itable;//Ihavetable.dataproperlypopulatedatcompiletime它工作得很好,table.data在编译时正确填充。但是,如果我更改纯二维数组int[H][W]与std::array,W>,我在循环体中有错误:error:calltonon-constexprfunction'

c++ - 当有额外的括号时,在临时对象上调用用户定义的 operator+ 时出错

如果我有一个用户定义的operator+()如:classA{public:Aoperator+(A){returnA();}};然后以下工作按预期工作:Aa=A()+A();但是g++-4.7给出了以下错误消息:Aa=(A())+A();具体的错误信息是error:nomatchfor‘operator+’in‘+A()’。看起来(A())在表达式中被忽略了。我的问题是:Aa=(A())+A();是否应该编译,如果没有,为什么不呢?注意:当我执行#defineX(Identity())然后尝试执行X+X时,这发生在我身上。 最佳答案

c++ - 当有额外的括号时,在临时对象上调用用户定义的 operator+ 时出错

如果我有一个用户定义的operator+()如:classA{public:Aoperator+(A){returnA();}};然后以下工作按预期工作:Aa=A()+A();但是g++-4.7给出了以下错误消息:Aa=(A())+A();具体的错误信息是error:nomatchfor‘operator+’in‘+A()’。看起来(A())在表达式中被忽略了。我的问题是:Aa=(A())+A();是否应该编译,如果没有,为什么不呢?注意:当我执行#defineX(Identity())然后尝试执行X+X时,这发生在我身上。 最佳答案

c++ - operator= 和 C++ 中未继承的函数?

在我刚刚进行的测试之前,我认为只有构造函数不会在C++中被继承。但显然,赋值operator=并不太...这是什么原因?是否有任何解决方法来继承赋值运算符?operator+=,operator-=,...也是这样吗?是否所有其他函数(除了构造函数/operator=)都是继承的?其实我是在做CRTP的时候遇到这个问题的:templateclassBase{inlineCrtp&operator=(constBase&rhs){/*SOMETHING*/;returnstatic_cast(*this);}};classDerived1:publicBase{};classDerive

c++ - operator= 和 C++ 中未继承的函数?

在我刚刚进行的测试之前,我认为只有构造函数不会在C++中被继承。但显然,赋值operator=并不太...这是什么原因?是否有任何解决方法来继承赋值运算符?operator+=,operator-=,...也是这样吗?是否所有其他函数(除了构造函数/operator=)都是继承的?其实我是在做CRTP的时候遇到这个问题的:templateclassBase{inlineCrtp&operator=(constBase&rhs){/*SOMETHING*/;returnstatic_cast(*this);}};classDerived1:publicBase{};classDerive

c++ - 为什么我可以使用 operator= 而不是 operator== 与 C++11 大括号初始化器?

看这个例子:structFoo{inta;intb;booloperator==(constFoo&x){returna==x.a&&b==x.b;}};intmain(){Fooa;a={1,2};if(a=={1,2})//error:expectedprimary-expressionbefore‘{’token{}}a={1,2}行很好。大括号被转换为Foo以匹配隐式operator=方法的参数类型。如果operator=是用户定义的,它仍然有效。if(a=={1,2}})行错误,如图所示。为什么表达式{1,2}不转换为Foo以匹配用户定义的operator==方法?

c++ - 为什么我可以使用 operator= 而不是 operator== 与 C++11 大括号初始化器?

看这个例子:structFoo{inta;intb;booloperator==(constFoo&x){returna==x.a&&b==x.b;}};intmain(){Fooa;a={1,2};if(a=={1,2})//error:expectedprimary-expressionbefore‘{’token{}}a={1,2}行很好。大括号被转换为Foo以匹配隐式operator=方法的参数类型。如果operator=是用户定义的,它仍然有效。if(a=={1,2}})行错误,如图所示。为什么表达式{1,2}不转换为Foo以匹配用户定义的operator==方法?

c++ - 如果键不存在,为什么 std::map operator[] 会创建一个对象?

我很确定我已经在某个地方看到过这个问题(comp.lang.c++?Google似乎也没有在那里找到它),但是在这里快速搜索似乎没有找到它,所以在这里:为什么std::mapoperator[]如果键不存在会创建一个对象?我不知道,但对我来说,如果你与大多数其他operator[](如std::vector)相比,这似乎违反直觉,如果你使用它,你必须确保索引存在。我想知道在std::map中实现这种行为的基本原理是什么。就像我说的那样,在使用无效键访问时更像是vector中的索引并崩溃(我猜是未定义的行为)不是更直观吗?我得到了很多答案,基本上都说“它很便宜,为什么不呢?”或类似的。我