草庐IT

c++ - 关于C++模板语法的一个问题(STL库源码)

我现在正在阅读STL源代码。虽然我理解我在STL_list.h中阅读的内容,但我想完全理解以下代码片段(我认为主要与模板语法相关)。模板class_List_base{...typedeftypename_Alloc::templaterebind>::other_Node_Alloc_type;//(1)....typedef_Allocallocator_type;get_allocator()const{returnallocator_type(*static_cast(&this->_M_impl));}//(2)...};有人能解释一下为什么我们在第(1)行的_Alloc之后

c++ - 使用 2 个参数堆叠 STL

我在C++中实现了一个B树,我有一个保存对的堆栈。我的问题是,我如何放入这个堆栈,因为push只接受1个参数。谢谢 最佳答案 使用标准库提供的std::pair。您可以使用函数make_pair创建它们.#include#include#includeusingnamespacestd;intmain(intargc,char**argv){intmyInt=1;stringmyString("stringVal");stack>myStack;myStack.push(make_pair(myString,myInt));retu

c++ - std::stringstream 如何处理 operator<< 中的 wchar_t*?

鉴于以下代码段无法编译:std::stringstreamss;ss我也不认为这个会:std::stringstreamss;ss但确实如此(至少在VC++上)。我猜这是由于以下ostream::operator过载:ostream&operator如果我不小心混合了字符类型,这是否有可能悄悄地破坏我的代码? 最佳答案 是的-您需要wstringstream用于wchar_t输出。您可以通过不使用字符串文字来缓解这种情况。如您所述,如果您尝试将constwstring&传递给stringstream,它将无法编译。

c++ - 访问集合的第 n 个元素

有一组visited。我想检查它从第4到最后的所有元素。我正在尝试做类似的事情intvisited_pointer=4;for(set::iteratori_visited=visited.begin()+visited_pointer;i_visited!=visited.end();i_visited++)operator+出错。我怎样才能以正确的方式做到这一点? 最佳答案 operator+的用法仅为随机访问迭代器提供。set迭代器是双向迭代器。但函数std::advance可用于将任何迭代器移动一定数量的位置:#includ

c++ - 使用 STL 算法重写的指针的循环示例,没有循环?

例如,我将如何重写下面的代码,使用没有循环的STL算法?vectorpizzaBox;intbiggestSlice=0;for(int*p=&pizzaBox[0];p!=pizzaBox[pizzaBox.size()];p++){if(*p>biggestSlice)biggestSlice=*p;} 最佳答案 假设您实际上是指vector,并在更正循环结束条件后,您可以使用max_element算法在这里:intbiggestSlice=*max_element(pizzaBox.begin(),pizzaBox.end()

c++ - 引用 front 和 pop_front

这合法吗?:Sample&sample=stack.front();stack.pop_front();我的程序有效。但是示例类有boost::optionalxxx成员(member)及之后pop_front,is_initialized()返回错误; 最佳答案 不,这是不合法的。您必须复制该对象,即使用Samplesample=stack.front()如果您使用的是std::vector,则pop_front调用会将后面的元素移动到该位置,并且您的引用指向不同的元素(之前的第二个,现在是第一个元素。)

c++ - 为什么我不能写入字符串文字,而我*可以*写入字符串对象?

如果我定义如下,char*s1="Hello";为什么我不能做下面的事情,*s1='w';//givessegmentationfault...why???如果我做下面这样的事情会怎样strings1="hello";我可以像下面那样做吗,*s1='w'; 最佳答案 因为"Hello"创建了一个constchar[]。这会衰减为constchar*而不是char*。在C++中,字符串文字是只读的。您已经创建了一个指向此类文字的指针,并正在尝试写入它。但是当你这样做的时候strings1="hello";您将constchar*"he

c++ - 可以简化这个表达式吗?

假设我有一个带有成员变量的类:std::unordered_map>myMap在成员函数中我想做以下事情:std::for_each(myMap.begin(),myMap.end(),[](std::pair>&pair){pair.second->someMethod();});有没有办法缩短lambda表达式?我以为我可以做到这一点,但它不是有效的语法:std::for_each(myMap.begin(),myMap.end(),[](decltype(myMap::valueType)&pair){pair.second->someMethod();});

与 vector 相比,C++ STL 队列内存使用情况?

我想知道与vector相比,队列到底使用了多少内存。前几天我遇到了一个问题,我有一个使用大约60MB的int队列数组,当相同的数据被放入一个vector的vector中时,它使用了大约4MB。这是我在编写程序时的错误,还是STL队列通常使用比vector更多的内存? 最佳答案 std::queue是容器适配器,而不是容器本身。那么让我们比较一些实际容器的开销:std::vector非常节省内存,它几乎使用零开销。std::vector在大多数平台上,每个项目使用大约4个字节。std::list内存效率非常低,每个项目可能会使用两个开

c++ - 为什么没有给 std::forward_list 一个 count() 成员函数?

我明白为什么std::forward_listdoesnothaveasize()memberfunction,因为O(1)版本会搞乱某些splice()的复杂性过载,并且由于O(N)version将与标准库的所有其他容器不一致。这也是事实std::list和std::forward_list已经有几个其他成员函数与中的表亲具有相同的语义标准库的一角(merge()、reverse()、remove()、remove_if()、unique()、sort())。那么为什么不是count()O(N)的成员函数提供给std::forward_list的复杂性具有返回std::distanc