草庐IT

c++ - 获取对 std::list 中最后两个元素的引用

我需要std::list中最后两个元素的别名。最后一个很简单(.back()),但是我应该如何得到它之前的那个呢?我的第一个想法是:在最后一个元素(.end())之后获取一个迭代器,并将它向左移动两次。这是我“制作”的内容:&last_but_one=*----myList.end(),虽然它有效,但我个人觉得它有点模糊,如果我在别人的代码中看到它,我认为我不会轻易解析它1。通读thisanswer显示了一些其他(过于)冗长的方法2:autoiter=n.end();std::advance(iter,-2);&last_but_one=*iter;//thisisoverkill!/

c++ - C++ 中的分配器用法(STL 树)

我最近一直在尝试了解C++分配器的工作原理,并且一直在寻找STL库用于类似std::set之类的红黑树的实现。或std::map,但有些事情我无法理解。首先要做的是从容器必须存储的类型转换分配器-_Val-树使用的节点类型-_Rb_tree_node-使用重新绑定(bind)模板:typedeftypename__gnu_cxx::__alloc_traits::templaterebind>::other_Node_allocator;typedef__gnu_cxx::__alloc_traits_Alloc_traits;这个我可以解决。现在,当一个元素被插入并且它需要创建一个新

c++ - 为什么 std::function 在这种情况下不起作用?

假设我有一个类型:structmy_type{doubleoperator()(inta){return3.1415;}};然后我想将它包装在std::function中。考虑两种不同的方法:my_typem_t;std::functionf(std::move(m_t));std::cout一切如我所料,打印出了PI的第一位数字。然后第二种方法:std::functionff(my_type());std::cout在我看来,这段代码与第一个代码绝对相同。rvalue作为参数传递给function包装器。但问题是,第二个代码无法编译!我真的不知道为什么会这样。

c++ - 在 C++ 中没有 **std::fixed** 的 **std::setprecision()** 的作用是什么?

如教程所示http://www.cplusplus.com/reference/iomanip/setprecision///setprecisionexample#include//std::cout,std::fixed#include//std::setprecisionintmain(){doublef=3.14159;std::coutstd::cout行不打印5个十进制数字,但在设置std::fixed后,setprecision有效正如预期的那样。这是为什么?。没有std::fixed的std::setprecision()有什么作用? 最佳答

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++ - 为什么没有更多的迭代器随机访问?

我正在努力了解更多有关C++中的STL迭代器的信息。我了解不同的数据结构如何具有不同的迭代器,但我不明白为什么有些迭代器不是RandomAccess。例如,为什么LinkedList迭代器不是随机访问迭代器?我知道LinkedList本身不是“随机访问结构”,但我们不能实现迭代器来产生随机访问结构的错觉吗?例如,LinkedList有一个双向迭代器,它没有定义+或+=运算符,但定义了++运算符。难道我们不能只定义+和+=运算符,使用类似的东西:iteratoroperator+=(intsteps){for(inti=0;ioperator++();}}在查看了RandomAccess

c++ - 如何用空指针初始化 unique_ptr 的 vector ?

我需要初始化一个vector>与nullptr秒。this中的方法帖子太复杂了。我的情况比较特殊,只需要初始化为nullptr.我怎样才能实现它?我知道我可以使用for循环来push_back一个nullptr每一次。有什么优雅的方法吗?顺便说一句,make_unqiue不适用于我的编译器。#include#include#includeusingnamespacestd;structTNode{//charch;boolisWord;vector>children;TNode():isWord(false),children(26,nullptr){}};intmain(){TNod

c++ - 如何通过索引递增的generate_n填充STL容器

要用依赖于索引的值填充STL容器,我通常会像下面的代码那样编写。有没有办法在不声明索引的情况下做同样的事情?intmain(){staticintN=10;autofunc=[](intidx){returnidx*(idx+1)+1;};intidx=-1;std::listlst;std::generate_n(std::back_inserter(lst),N,[&](){idx++;returnfunc(idx);});} 最佳答案 您可以将索引移动到lambda捕获中并使lambda像这样可变(需要C++14):std::

c++ - 什么时候适合使用 std::optional

我想知道这是否会被视为std::optional的有效用法。我有一个返回process_id(std::uint32_t值)的函数,使用标准的“std::uint32_t会更有效吗>"如果我​​们找不到目标进程ID或返回std::optional更合适则返回0的函数?例子:std::optionalFindProcessID(std::string_viewprocess){boolfind=false;if(!find)//wefailtofindtheprocess_idandreturnnothing.returnstd::nullopt;elseif(find)return10

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定义比较键,