草庐IT

c++ - 转换 shared_ptr 类型 vector 的迭代器

如何转换shared_ptr类型vector的迭代器?考虑以下示例:typedefboost::shared_ptrtype_myClass;vectorvect;vector::iteratoritr=vect.begin();while(itr!=vect.end()){//Followingstatementworks,butIwishtorathercastthis//toMyClassandthencallafunction?(*itr)->doSomething();} 最佳答案 您不想转换,而是提取对该对象的引用:My

C++ vector 内存使用 - 它曾经被释放过吗?

我知道,当超过capacity()时,vector的大小会加倍。这个操作需要一些时间,这就是为什么vector应该有分摊常数时间来使用push_back()添加元素。我想知道的是...当一个vector缩小到size()小于capacity().vector是否会放弃它们使用的内存,或者直到vector被销毁它才消失?如果它们不缩小尺寸,可能会浪费大量内存,但我从未听说过它们具有该功能。 最佳答案 不,它在销毁之前永远不会被释放(即容量永远不会减少)。释放一些内存的常用习惯是创建一个正确大小的新vector,然后使用它:std::v

c++ - 从四元数查看矩阵

我目前正在构建自己的四元数相机。据我所知,您只需要一个四元数即可完全指定相机的方向(如果我错了,请纠正我)。那么,我将如何创建View矩阵?顺便说一下,我使用C++作为编程语言。任何帮助,将不胜感激。 最佳答案 首先是一些警告。你会在网上和关于这个主题的文献中看到许多明显相互矛盾的公式。大多数冲突只是显而易见的。有一些是真正的冲突,但那是因为有人计算错了。问题是没有单一的正确方法可以做到这一点。您需要知道您如何使用四元数和矩阵,源如何使用它们,以及如何纠正这些明显的差异。旋转与变换您的相机有一个与之关联的引用系,底层空间也是如此。您

c++ - 在 C++ 中实现虚拟析构函数

我开始学习C++,但我被困在析构函数中。我们需要实现一个vector,这就是我目前所拥有的。#include#include#includeusingnamespacestd;templateclassVector{templatefriendostream&operator&);private:T*data;unsignedlen;unsignedcapacity;public:Vector(unsigned=10);Vector(constVector&);virtual~Vector(void);Vector&operator=(constVector&);booloperato

c++ - std::vector 和复制构造函数

vectorv;Xx;v.push_back(x);v.push_back(x);v.push_back(x);为什么这段代码调用类X的复制构造函数6次?(使用g++4.7.2STL)拜托,我想知道准确地这个特定的STL在引擎盖下发生了什么。 最佳答案 当您使用push_back()插入x时,内存最终会重新分配以便为新元素腾出空间。然后必须使用复制构造函数X(constX&)复制已经插入的成员。如果你插入v.reserve(3);至少前三个push_back()的重新分配被阻止,因此,将只有三个调用X(constX&)

c++ - C++ 中的 Realloc 等价物

是的,另一个realloc与std::vector的问题。我知道你要说什么,我同意,忘记手动内存分配,只使用std::vector。不幸的是,我的教授禁止我在这项作业中使用STL中的任何内容。是的,我有一个T的动态数组,我需要它可以调整大小,但我不能使用std::vector。我可以回到黑暗时代并使用malloc和family完成所有事情,但如果我可以使用new那就太棒了。我读过很多帖子,每个人都说“不,你不能这样做,使用std::vector”,但它们都是在2011年8月之前发布的,我希望自从C++11出现以来,某些事情可能会有所改变。那么告诉我,我是走运了,还是必须恢复到C风格的内

c++ - C++11 中 RAW 指针的智能 vector ?

我正在使用一个旧的开源库,具有以下感兴趣的(简化的)API://someclassthatholdsarawpointertomemoryontheheap//DOESNOTdeleteitinitsdestructor//DOESNOTdoa"deep"copywhencopied/assigned(i.e.,aftercopyingbothobjects//willpointtothesameaddress)classPoint;//functionusedtoconstructapointandallocateitsdataontheheapPointAllocPoint();/

c++ - std::vector 成员的移动语义

我想确保我正确理解了这一点。我在这里问它,因为我没有明确说明它的资金。例如我有一个三角形网格类,基本上是这样构建的:classMesh{public:structFace{unsignedinta;unsignedintb;unsignedintc;};//...private:std::stringfile;std::vectorvertices;std::vectornormals;std::vectortexcoord;std::vectorfaces;}由于网格中的数据可能会变得非常大,我想实现适当的移动语义。对于指针类型,我完全理解这一点,但要触发右值构造函数,我需要使用移动

c++ - 给定排序 vector 找到从负到正的转换

给定一个排序的std::vector,我想使用C++11-STD函数找到元素从负向正过渡的索引。我知道我可以使用二进制搜索来实现它,但我对标准库中是否有任何函数感兴趣,类似于一元find_if,这将有助于此搜索(可能与正确的lambda表达式有关)。 最佳答案 您应该找到lower_bound共0个:autoiter=std::lower_bound(vec.begin(),vec.end(),0);生成的迭代器将指向最早的位置,您可以在该位置插入0而不会打乱元素的顺序。同样,upper_bound将返回最右边的此类迭代器。算法的运

c++ - 删除 vector 中的所有元素,直到第一个非零元素 C++

我有一个vector,它将在其开头存储可变数量的零元素。这些需要删除。我试过:while(v.at(0)==0){v.erase(v.begin());}但这会抛出一个std::out_of_range错误。如有任何帮助,我们将不胜感激。 最佳答案 您可以使用std::find_if找到第一个非零值,然后是erase这些元素:autofirst_non_zero=std::find_if(begin(v),end(v),[](intn){returnn!=0;});v.erase(begin(v),first_non_zero);(