草庐IT

stl_algobase

全部标签

c++ - 在 Visual Studio 2015 中检查 STL 容器

我正在运行VisualStudioEnterprise2015,版本14.0.23107.0D14REL。调试C++程序时,我看不到STL容器的内容。我没有选中“在变量窗口中显示对象的原始结构”选项(工具->选项->调试->常规)。这是一个说明问题的例子:#include#include#includeintmain(){std::stringstring="test";std::vectorvector{4,5,6};std::listlist{"one","two","three"};return0;}在Locals或Watch窗口中,我看到以下内容:list[...]()vect

c++ - 在映射中使用对作为键 (C++/STL)

我想使用STL中的一对作为映射的键。#include#includeusingnamespacestd;intmain(){typedefpairKey;typedefmapMapa;Keyp1("Apple",45);Keyp2("Berry",20);Mapamapa;mapa.insert(p1,"Manzana");mapa.insert(p2,"Arandano");return0;}但是编译器会抛出一堆不可读的信息,而且我对C和C++很陌生。如何在map中使用一对作为键?一般来说,我如何使用任何类型的结构(对象、结构等)作为映射中的键?谢谢! 最

c++ - 在映射中使用对作为键 (C++/STL)

我想使用STL中的一对作为映射的键。#include#includeusingnamespacestd;intmain(){typedefpairKey;typedefmapMapa;Keyp1("Apple",45);Keyp2("Berry",20);Mapamapa;mapa.insert(p1,"Manzana");mapa.insert(p2,"Arandano");return0;}但是编译器会抛出一堆不可读的信息,而且我对C和C++很陌生。如何在map中使用一对作为键?一般来说,我如何使用任何类型的结构(对象、结构等)作为映射中的键?谢谢! 最

c++ - 为什么 STL 容器没有虚拟析构函数?

有人知道为什么STL容器没有虚拟析构函数吗?据我所知,唯一的好处是:它将实例的大小减少了一个指针(指向虚拟方法表),并且它使破坏和构建速度更快。缺点是以通常的方式对容器进行子类化是不安全的。我的问题可以换一种说法是“为什么STL容器没有设计为允许继承?”因为它们不支持继承,当一个人想要一个需要STL功能和少量附加功能的新容器(比如一个专门的构造函数或具有默认值的新访问器)时,就会陷入以下选择。map,或其他):组合和接口(interface)复制:创建一个新的模板或类,它拥有作为私有(private)成员的STL容器,并且每个STL方法都有一个直通内联方法。这与继承一样高效,避免了虚拟

c++ - 为什么 STL 容器没有虚拟析构函数?

有人知道为什么STL容器没有虚拟析构函数吗?据我所知,唯一的好处是:它将实例的大小减少了一个指针(指向虚拟方法表),并且它使破坏和构建速度更快。缺点是以通常的方式对容器进行子类化是不安全的。我的问题可以换一种说法是“为什么STL容器没有设计为允许继承?”因为它们不支持继承,当一个人想要一个需要STL功能和少量附加功能的新容器(比如一个专门的构造函数或具有默认值的新访问器)时,就会陷入以下选择。map,或其他):组合和接口(interface)复制:创建一个新的模板或类,它拥有作为私有(private)成员的STL容器,并且每个STL方法都有一个直通内联方法。这与继承一样高效,避免了虚拟

c++ - 为什么 STL 实现如此难以理解?在这里如何改进 C++?

例如,为什么STL实现中的大多数成员都有_M_或_或__前缀?为什么有这么多样板代码?C++缺少哪些功能可以使vector(例如)实现更清晰、更简洁? 最佳答案 实现使用以下划线开头的名称,后跟一个大写字母或两个下划线,以避免与用户定义的宏发生冲突。这些名称在C++中是保留的。例如,可以定义一个名为Type的宏。然后#include.如果vector使用的实现Type作为模板参数名称,它会中断。但是,不允许定义名为_Type的宏。(或__type、type__等)。因此,vector可以安全地使用这些名称。

c++ - 为什么 STL 实现如此难以理解?在这里如何改进 C++?

例如,为什么STL实现中的大多数成员都有_M_或_或__前缀?为什么有这么多样板代码?C++缺少哪些功能可以使vector(例如)实现更清晰、更简洁? 最佳答案 实现使用以下划线开头的名称,后跟一个大写字母或两个下划线,以避免与用户定义的宏发生冲突。这些名称在C++中是保留的。例如,可以定义一个名为Type的宏。然后#include.如果vector使用的实现Type作为模板参数名称,它会中断。但是,不允许定义名为_Type的宏。(或__type、type__等)。因此,vector可以安全地使用这些名称。

c++ - 如何在 STL priority_queue 中进行有效的优先级更新?

我有一些对象的priority_queue:typedefpriority_queueQueue;Queuequeue;有时,其中一个对象的优先级可能会发生变化-我需要能够以有效的方式更新队列中该对象的优先级。目前我正在使用这种有效但似乎效率低下的方法:QueuenewQueue;while(!queue.empty()){Objectobj=queue.top();queue.pop();if(priorityHasChanged(obj))newQueue.push_back(Object(new_priority));elsenewQueue.push_back(obj);}ne

c++ - 如何在 STL priority_queue 中进行有效的优先级更新?

我有一些对象的priority_queue:typedefpriority_queueQueue;Queuequeue;有时,其中一个对象的优先级可能会发生变化-我需要能够以有效的方式更新队列中该对象的优先级。目前我正在使用这种有效但似乎效率低下的方法:QueuenewQueue;while(!queue.empty()){Objectobj=queue.top();queue.pop();if(priorityHasChanged(obj))newQueue.push_back(Object(new_priority));elsenewQueue.push_back(obj);}ne

c++ - end() 是否需要在 STL 映射/集中保持不变?

标准中的第23.1.2.8节规定,对集合/映射的插入/删除操作不会使这些对象的任何迭代器无效(指向已删除元素的迭代器除外)。现在,考虑以下情况:您想要实现一个具有唯一编号节点的图,其中每个节点都有固定数量(比如4个)的邻居。利用上述规则,您可以这样做:classNode{private://iteratorstoneighboringnodesstd::map::iteratorneighbors[4];friendclassGraph;};classGraph{private:std::mapnodes;};(EDIT:由于第4行中的Node不完整(见回复/评论),因此并非字面上如此