草庐IT

c++ - 为什么调用 std::vector::back() 会使我的程序崩溃

我不确定这段代码有什么问题:std::vectormyVector(0);if(myVector.back()==12)myVector.push_back(12);似乎在空vector上调用back()会使程序崩溃。我不明白为什么会崩溃?我们需要在调用back()之前检查vector的长度吗?或者这可能是一个错误?文档说,如果vector为空,它会返回一个未定义的值。 最佳答案 doweneedtocheckthelengthofthevectorbeforecallingback()?一句话:是的。这是你的错误,你的vector

c++ - 有没有更有效的方法从流中设置 std::vector ?

目前,我设置了一个std::vector的值来自std::ostringstream如下:voidfoo(std::vector&data,std::stringstream&stream){data=std::vector(stream.str().begin(),stream.str().end());}我想知道在C++中使用STL是否有更有效的方法,或者我在这里给出的方法是否合适?使用std::stringstream会更好吗?相反? 最佳答案 正如评论中所指出的,由于对str()的两次调用,您的代码不正确。为了提高效率,您可

c++ - 我怎样才能将原始数组的 memcpy 等效于 std::vector?

我有一个类(除其他外)有一个指向unsignedchar的指针,该指针被删除并重新分配以存储来自另一个数组的一些数据。这是用一个函数完成的classMyClass{private:unsignedchar*m_Buffer;intm_BufferSize;public:boolSetBuffer(intiSize,constunsignedchar*pArray);};boolMyClass::SetBuffer(intiSize,constunsignedchar*pArray){boolbOK=false;if(pArray!=NULL&&iSize>0){delete[]m_Bu

c++ - 为什么将树存储为连续的内存块?

我刚刚发现有一些基于树的数据结构,在寻求高性能时,通常存储为连续的内存块,这在使用所谓的“基于策略的数据结构”时尤其流行。问题是我无法理解为什么有人愿意这样做;当您尝试“线性化”一棵树以将其存储为vector/数组时,您如何确保以有意义的方式重新排列Twig和叶子以帮助提高性能?这仅适用于完美平衡的树吗?换句话说,我无法想象用于访问跨越多个级别并具有多个叶子的线性数据结构的模式;通常一棵树为每个节点/叶子添加1级间接,这为用户简化了很多事情,但是应该如何组织这样的“线性”树? 最佳答案 您可能会找到这篇短文here有趣基本上,为这种

c++ - 将 vector 地址分配给迭代器

我希望vector迭代器指向一个vector元素。我有#include#includeintmain(){std::vectorvec={1,2,3,4,5};std::vector::iteratorit;//want"it"topointtothe"3"element,sosomethinglike//it=&prices[2];//it=&prices.at(2);}但是这些尝试都不起作用。我想我需要一些返回迭代器的vector函数,而不是地址(?) 最佳答案 neitheroftheseattemptswork确实,您不能从

c++ - 如何将 std::queue 转换为 std::vector

我需要使用double队列,因为它作为有序容器具有良好的特性。我想将此队列传递给接受vector的类构造函数。如果我直接这样做,我会收到以下错误:candidateconstructornotviable:noknownconversionfrom'std::queue'to'std::vector&'for2ndargument如何将队列转换为vector? 最佳答案 模拟queue_like行为和vector-like行为的正确容器是std::deque。这样做的好处是:在双端队列的任意一端进行恒定时间插入和删除能够在不破坏双端

c++ - 函数调用中的单元素 vector 初始化

考虑以下示例代码:示例:voidprint(intn){coutvec){coutv={2};/*call3*/print(v);/*call4*/print(std::vector{2});return0;}生成以下输出:elementprintelementprintvectorprintvectorprint为什么对print函数的调用(上例中的调用2)与接受单个值的函数相匹配?我在这个调用中创建了一个vector(包含单个元素),所以它不应该匹配以vector作为输入调用print吗?这是部分讨论inanotherquestion其中提供的解决方案适用于具有1个以上元素的vec

c++ - OpenGL 和 STL?

我正在使用openGL,目前正在向它传递一个顶点数组。问题是我必须创建许多顶点,并将它们添加到彼此之间(为了排序)。这意味着使用常规数组非常烦人/效率低下。我想使用STL中的数据结构,以便可以高效(轻松)地将新顶点放在任何索引处。问题是openGL需要一个常规数组。有人知道怎么做吗?有没有一种简单的方法可以将STLvector转换为数组?我正在使用openGL1.1谢谢 最佳答案 您可以使用指向vector首地址的指针作为数组指针。STLvector保证将它们的元素保存在连续的内存中。所以你可以做类似的事情:&vertices[0]

c++ - 在 std::vector::reserve 之后访问原始指针安全吗?

这有点牵强,但下面的代码“安全”吗(即保证不会导致段错误):std::vectorvec(1);//Ensuresthat&vec[0]isvalidvec.reserve(100);memset(&vec[0],0x123,sizeof(int)*100);//Safe?我意识到这很丑陋-我只想知道它在技术上是否安全,而不是“漂亮”。我猜它的唯一用途可能是忽略存储在给定索引之外的值。注意!HowcanIgettheaddressofthebufferallocatedbyvector::reserve()?涵盖相同的主题,但我更感兴趣的是这是否安全以及这样做是否存在陷阱。编辑:原来的

当 push_back 新元素到 std::vector 时,C++ 引用发生变化

我不确定这是怎么回事-请告诉我下面的代码有什么问题。我修改了我的代码以将其简化为最简单的术语。有一个带有一堆MyNode对象的std::vector。第一步是获取对这些节点之一的数据元素之一的常量引用(Datam_data)——在下面的示例中,在插入第二个节点之前只有一个节点,如下所示:constcv::Data&currData=m_nodesVector[currIndex].GetData();MyNodenode(...);m_nodesVector.push_back(node);恰好在vector::push_back调用时,currData的值发生了变化!!我只是不明白。