草庐IT

vector_tostr

全部标签

c++ - 为什么使用指针 vector 被认为是不好的?

最近有人认为我不应该使用指针vector。我想知道-为什么我不能?例如,如果我有一个类foo,则可以这样做:vectorv;v.push_back(newfoo());我已经看到一些人反对这种做法,这是为什么呢? 最佳答案 在容器中存储普通指针会导致内存泄漏和悬挂指针。将指针存储在容器中不会定义指针的任何类型的所有权。因此容器不知道解构和复制操作的语义。当元素从容器中移除时,容器不知道如何正确销毁它们,当执行复制操作时,不知道所有权语义。当然,您始终可以自己处理这些事情,但仍有可能出现人为错误。使用智能指针将所有权和销毁语义留给它们

c++ - 如果分配器提供 realloc 语义,std::vector 是否可以避免复制?

我有一个内存接口(interface),可以将获取地址空间与附加后备存储分开。(在Linux下,由接口(interface)管理的地址空间池是mmap的MAP_ANONYMOUS和MAP_NORESERVE,madvise的MADV_DONTNEED和mprotect的PROT_NONE。然后由madviseMADV_WILLNEED和mprotectPROT_READ、PROT_WRITE和PROT_EXEC附加支持。)这个接口(interface)允许我在延迟获取实际物理内存的同时分配大量地址空间。我想用它来创建一个“惰性vector”,它在适当的点请求后备存储,但不会随着vect

c++ - 我如何从 uint8_t vector 创建一个 istream?

我正在为过去只能读取本地文件的代码添加通过网络获取数据的功能。我正在使用的网络库以vector的形式发送和接收数据.我希望能够在读取文件后重用处理数据的代码,但该代码需要一个std::istream,有没有办法让istream读取vector数据?这是相同的数据,所以我觉得应该有一种方法,但我一直无法找到或弄清楚如何做的代码。当前代码:std::ifstreamstream("data.img",std::ios::in|std::ios::binary|std::ios::ate);if(!stream.is_open()){throwstd::invalid_argument("C

c++ - 按索引 vector 对 Armadillo 矩阵的所有列进行排序的最佳方法

我想知道是否有更好的方法来实现我在这里所做的事情。我有一个arma矩阵,我想通过存储在uvecvector中的索引重新排序它的所有列。我想我基本上是在复制整个矩阵。#includeusingnamespacearma;intmain(){//getadiscreterandommatrix//definedumatbecauseeventuallywantto//orderbyagivencolumnOFA.irrelevantnow.umatA=randi(4,6,distr_param(0,3));std::cout(0,A.n_cols-1,A.n_cols);//orderAL

c++ - 根据另一个 vector 对点 vector 进行排序

我正在开发C++应用程序。我有2个点vectorvectorvectorAll;vectorvectorSpecial;Point2f定义typedefPoint_Point2f;vectorAll有1000个点,而vectorSpecial有10个点。第一步:我需要根据vectorAll中的顺序对vectorSpecial中的点进行排序。所以像这样:ForeachPointinvectorSpecialGetTheOrderOfthatpointinthevectorAllInsertitinthecorrectorderinanewvector我可以做一个双循环并保存索引。然后根据

c++ - std::deque 在末尾插入是否比 std::vector 快?

我开始比较:插入列表的前面插入vector的后面插入双端队列的前端但后来我注意到,即使在push_back()上,双端队列似乎也更快。我一定是做错了某事,我无法相信更通用的容器会优于特定的容器。我的代码使用谷歌基准测试:#include"benchmark/benchmark.h"#include#include#defineNUM_INS1000staticvoidBM_InsertVector(benchmark::State&state){std::vectorv;v.reserve(NUM_INS);while(state.KeepRunning()){state.PauseT

c++ - vector 和列表的 end() 迭代器的语义

根据C++标准,如果vector的新大小超过其容量,则对vector调用push_back()会使迭代器失效,但在列表上它永远不会使迭代器失效。现在考虑以下代码片段:1.vectorv{1,2,3};v.reserve(100);for(inti:v){v.push_back(i);}2.listl{1,2,3};for(inti:l){l.push_back(i);}我用gcc4.8试了一下,发现代码1以v结束时为{1,2,3,1,2,3},但代码2运行进入无限循环。对我来说,解释似乎很简单:vector的end()迭代器指向一个内存位置,并且由于itisonlyevaluatedo

C++如何将排序的 vector 合并到排序的 vector 中/从所有 vector 中弹出最少的元素?

我有大约一百个排序的集合vector的尽管大多数vector中包含少量整数,但某些vector包含大量(>10K)整数(因此vector不一定具有相同的大小)。我想做的基本上是遍历所有这些已排序vector中包含的从最小到最大的整数。一种方法是将所有这些排序的vector合并到一个排序的vector中并简单地迭代。因此,问题1:将已排序vector合并为已排序vector的最快方法是什么?我敢肯定,另一方面,有更快/更聪明的方法可以在不合并和重新排序整个事物的情况下完成此操作——也许从这个已排序vector集合中迭代地弹出最小整数;没有先合并它们..所以:问题2:从一堆已排序的vect

c++ - 删除指针 vector

我需要创建类实例的指针,而程序在编译时并不知道我将创建多少个指针。对于删除,我考虑的是将指针存储在一个vector中,然后一个一个的删除。使用智能指针会是一种更清洁的方法吗?如果不想使用智能指针,那么这种vector的使用是否被认为是干净的?最小代码:#includeusingnamespacestd;classFoo{public:Foo();};Foo::Foo(){}voidcreateFooVector(intnb,std::vector&v){for(inti=0;iv;createFooVector(5,v);while(!v.empty()){Foo*f=v.back()

c++ - 从指针 vector 到 const 指针 vector 的重新解释是否安全?

这种转换类型安全吗vectora;constvector&b=reinterpret_cast&>(a);静态转换显然在这种情况下不起作用,因为模板参数正在改变。但是通过重新解释转换,我只是将常量添加到本质上相同的类型。那么对于所有实际用途来说这应该是安全的吗? 最佳答案 就像使用reinterpret_cast将引用转换为不相关的类型一样,它会产生未定义的行为,因此是不安全的,除非您将“安全”定义为“在我的编译器上工作”。 关于c++-从指针vector到const指针vector的重