草庐IT

c++ - STL 设置交集和输出

我有一个这样的代码片段,要在VC++2010下编译。std::sets1;std::sets2;std::setres_set;std::set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),res_set.begin());据我所知,这应该有效。但是,我收到构建错误:c:\programfiles(x86)\microsoftvisualstudio10.0\vc\include\algorithm(4494):errorC3892:'std::_Tree_const_iterator::operator*':youcann

c++ - std::unordered_map 非常高的内存使用率

昨天我尝试使用std::unordered_map并且这段代码让我困惑它使用了多少内存。typedeflistentityId_list;structtile_content{charcost;entityId_listentities;};unordered_maphash_map;for(size_ti=0;i所有这部分代码都是在Debug模式下在MSVS2010中编译的。我在我的任务管理器中看到的是大约1200kb的“干净”进程,但在填充hash_map之后它使用了8124kb的内存。这是unordered_map的正常行为吗?为什么占用这么多内存?

c++ - 为什么math.h中没有clamp函数

math.h麻烦地提供了min和max,但没有提供clamp函数。我本以为,由于它们在实现方面通常都是相似的,因此它们都会出现在同一个库中。math.h没有钳制函数|宏有什么特别的原因吗?是math.h的创建者认为没有必要,还是他们根本没有考虑过?编辑:人们似乎忽略了这里的重点。我不是问他们为什么不添加clamp因为我很懒而且不喜欢写一个新的clamp-恰恰相反,我几乎从不使用它(尽管不可否认我使用它比我使用一些标准库)。我要问的是“有谁知道为什么C++标准化机构或创建者或任何人选择不在math.h中包含钳位函数的任何原因?”。我绝不是提示它不在math.h中,我只是想问“它不存在有充

c++ - 将 std::unique_ptr 转换为 std::unique_ptr 到父类(super class)的正确方法是什么?

假设我有一个名为foo的类它继承自一个名为bar的类.我有一个std::unique_ptr到foo的实例我想将它传递给一个只接受std::unique_ptr的函数.我怎样才能转换指针以便它在我的函数中工作? 最佳答案 您可以转换std::unique_ptr右值std::unique_ptr:std::unique_ptrf(newfoo);std::unique_ptrb(std::move(f));显然,指针将由b拥有如果b被摧毁bar需要有一个virtual析构函数。 关于c+

c++ - 为什么 std::string_view::data 不包含空终止符?

这段代码有未定义的行为:#include#includeusingnamespacestd::string_view_literals;voidfoo(std::string_viewmsg){std::cout原因是std::string_view可以存储非空终止字符串,并且在调用data时不包含空终止符。这真的很有限,为了让上面的代码定义行为,我必须从中构造一个std::string:std::stringstr{msg};std::cout在这种情况下,这确实使std::string_view变得不必要了,我仍然必须复制传递给foo的字符串,所以为什么不使用移动语义并更改msg到

c++ - 如何构造一个 std::string 具有可变数量的空格?

如果我有以下代码:std::stringname="Michael";std::stringspaces="";我将如何以编程方式创建spaces字符串(一个包含所有空格、长度与名称变量匹配的字符串)? 最佳答案 您可以将一个字符和一个长度传递给一个字符串,它会用给定的字符填充该长度的字符串:std::stringspaces(7,'');您可以使用std::string的.size()属性来查找您姓名的长度;结合以上内容:std::stringname="Michael";std::stringspaces(name.size()

C++: std::vector::reserve 在包含指针时不保留

当我调用std::vector::reserve当标识符是std::vector类型时reserve(...)什么都不做:std::vectorbar;bar.reserve(20);//Iexpectbar.sizetoreturn20...std::size_tsz=bar.size();for(std::size_ti=0;i前述for循环恰好运行零次并且bar.size()返回零。我不记得这是否也适用于所有其他STL容器,但如果是的话,包括std::vector的行为:WHY? 最佳答案 .reserve()不会改变vect

c++ - std::array<T, ?> 类型的成员变量

如何为类型为std::array的模板类AClass声明和设置成员变量?(尺寸未定义)?实际std::array是在构造函数中创建的,其中数组的大小是构造函数的参数。在伪C++代码中:templateclassAClass{protected:std::array*array;public:AClass(intn){this->array=newstd::array;}}正确的代码会是什么样子? 最佳答案 不要为此使用std::array,请使用std::vector。std::array的大小必须是编译时常量。如果要在构造函数中传

c++ - std::bind 和 winsock.h 绑定(bind)混淆

我正在处理一个非常大的项目,在一个文件中我们突然遇到编译时错误,编译器似乎认为我们对winsock.hbind()的调用实际上是对std::bind()的调用。似乎在包含文件中的某处有usingnamespacestd代码片段。我们可以尝试找到这些usingnamespacestd在哪里被使用并删除它们,但也许有更好的方法来做到这一点? 最佳答案 您可以更改您的调用以使用::bind()来指定全局命名空间。 关于c++-std::bind和winsock.h绑定(bind)混淆,我们在S

c++ - 从 STL std::queue 中删除而不破坏已删除的对象?

我能在STL容器(队列和列表)上找到的所有文档都说,对于任何删除函数,都会调用已删除对象的析构函数。这意味着我无法在任何时候使用std::queue来获得一个队列,该队列只是一个需要对其执行某些操作的对象列表。我希望能够在他们排队等待我对他们做某事时将他们添加到队列中。然后我想在完成处理后将它们从中删除,而不破坏相关对象。从我读过的文档来看,这似乎是不可能的。我误读了文档吗?除了基本的“队列”之外,STL中是否还有其他类型的队列在调用pop_front时不调用已删除对象的析构函数?编辑澄清:在我的例子中,我使用的是指针列表。像这样:dbObject*someObject;queuein