草庐IT

const_set

全部标签

c++ - 传递与 const 和非常量引用相同的对象

以下代码使用g++v4.8.1编译并输出45,但它的编译是否保证基于标准?其他编译器会提示吗?#include#includevoidtest(conststd::vector&a,std::vector&b){b[0]=45;}intmain(){std::vectorv(1,0);test(v,v);std::cout我知道函数定义本身并没有错,但是当用同一个对象v调用test时,我有点期待我传递一个警告作为const和非const引用的单个对象。 最佳答案 没有问题,因为编译器将这两个参数视为不同的引用。要理解代码,请考虑以下

c++ - 如何获取字符串中的 std::set 字符作为字符串?

我有一个std::string。我想要其中的一组唯一字符,每个字符表示为std::string。我可以很容易地得到字符集:std::stringsome_string=...std::setchar_set(some_string.begin(),some_string.end());我可以将它们转换成这样的字符串:std::setstring_set;for(charc:char_set){string_set.emplace(1,c);}但是这样的做法看起来很别扭。有没有更好的(最好是标准库单行)方法来做到这一点? 最佳答案 您

c++ - set <T> vs set <T, comparator> (C++ 多态性)

为什么这段代码structThingComparator{...}staticvoidBlah(set&things){...}...setthings;Blah(things);编译失败并出现以下错误(VisualStudio2010):errorC2664:'Blah':cannotconvertparameter1from'std::set'to'std::set&'我的C++知识显然是有限的,但我希望听到喇叭声宣布多态骑士骑在他可信赖的骏马上,但我只能听到马屁和悲伤的长号:-( 最佳答案 std::set声明asfollow

c++ - 在哪些情况下 (const) 引用返回值是不安全的?

我倾向于经常使用以下符号:constDatum&d=a.calc();//continuetoused当calc的结果在堆栈上时,这有效,参见http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/.尽管编译器可能会在此处进行优化,但显式避免临时对象感觉很好。今天我意识到,d的内容在数据写入a的成员后变得无效。在这种特殊情况下,get函数只是返回对另一个成员的引用,然而这与write完全无关。像这样:constDatum&d=a.get();//...someoperation.

c++ - 标签调度、可变参数模板、通用引用和遗漏的 const 说明符

请考虑以下示例(标签分发、可变参数模板、完美转发等,全部合而为一):#include#include#includestructA{};structB{};voiddoIt(A&&,conststd::string&){std::coutvoiddoIt(T&&,Args&&...){std::coutvoidfn(Args&&...args){doIt(T{},std::forward(args)...);}intmain(){conststd::stringfoo="foo";std::stringbar="bar";fn(foo);fn(bar);fn(foo);}在这种情况下,

c++ - 无法将 const 应用于 typedef 引用

以下代码在将const应用于value_type&的返回值引用时有效,但如果我使用相同类型的typedef,则会出错。举个例子:classT{};classA{public:typedefTvalue_type;typedefvalue_type&reference;//Notworkingconstreferenceoperator*()const;//Butthisworks?//constvalue_type&operator*()const;};//Error!consttypenameA::referenceA::operator*()const{}intmain(){ret

c++ - 为什么在查找元素时需要使用 set.find(x) != set.end() 。

我想知道当我使用*(set.find(x))==x时出了什么问题而不是set.find(x)!=set.end()。它通常有效,但在尝试在Hackerrank上提问时(问题:link)。此代码为所有测试用例提供CA:intmain(){/*Enteryourcodehere.ReadinputfromSTDIN.PrintoutputtoSTDOUT*/sets;intn,x,y;cin>>n;while(n--){cin>>y>>x;if(y==1)s.insert(x);elseif(y==2)s.erase(x);else{set::iteratorit=s.find(x);if

c++ - 使临时变量的 const 引用成员安全吗?

我曾多次尝试这样编写代码:structFoo{doubleconst&f;Foo(doubleconst&fx):f(fx){printf("%f%f\n",fx,this->f);//125125}doubleGetF()const{returnf;}};intmain(){Foop(123.0+2.0);printf("%f\n",p.GetF());//0return0;}但它根本不会崩溃。我还使用valgrind来测试程序,但没有出现错误或警告。因此,我假设编译器自动生成了一段代码,将引用指向另一个隐藏变量。但我真的不确定。 最佳答案

c++ - VS 2017 不会隐式地将 const char* 转换为 char*

这个问题在这里已经有了答案:Conversionfromstringliteraltochar*isdeprecated[duplicate](2个答案)关闭4年前。我最近安装了VS2017,遇到了一个奇怪的问题。基本上,如果不明确地将它们转换为(char*),我就不能使用硬编码字符串。如果我说类似Function("test")的话,它只会抛出一个错误,指出constchar*与char*不兼容。我真的不想坚持使用VS2015:(。有人知道如何让VS认识到它们是同一回事吗?非常感谢。

c++ - C++ STL中set的 'insert'函数的原理是什么?

对于下面这段代码:intmain(){std::sets;for(inti=0;ival当符号'structNode{intval;Node(int_val=-1):val(_val){}booloperatorp.val;}};当我把函数改成这样时:booloperator=p.val;}输出变为:'5443210'。差异让我感到困惑,有人可以解释为什么会发生这种情况并解释“插入”功能的原理吗? 最佳答案 std::set使用operator默认情况下在key类型上,因此在第一种情况下,它使用operator为Node定义比较键,