草庐IT

EidosValue_Int_vector

全部标签

c++ - std::vector 如何支持未知大小的自定义对象的连续内存

我正在为正确的心智模型和对std::vector的理解而苦苦挣扎。我以为我知道的当您创建一个类型为T的vector,然后为该vector保留N个元素时,编译器基本上会找到并保留一个连续的内存块,即N*sizeof(T)字节。例如,//Initializeavectorofintstd::vectorintvec;//Reservecontigiousblockof44-bytechunksofmemoryintvec.reserve(4);//[|||]//Fillinginthememorychunkshasobviousbehavior:intvec.push_back(1);//

c++ - STL vector 性能

每次我调用push_back时,STLvector类都使用复制构造函数存储对象的拷贝。它不会减慢程序的速度吗?我可以有一个自定义链表类来处理指向对象的指针。虽然它没有STL的一些好处,但仍然应该更快。请看下面这段代码:#include#include#includeusingnamespacestd;classmyclass{public:char*text;myclass(constchar*val){text=newchar[10];strcpy(text,val);}myclass(constmyclass&v){coutlist;myclassm1("first");mycla

c++ - 标准 vector 大小调整

我有一些std::vector,我必须用一些默认值调整它的大小。这是代码:staticintCounter=0;classData{/*...*/Data(){Counter++;std::coutmArray;for(inti=0;i据我了解,在插入200个项目后,我可以使用resize函数调整它的大小,该函数为每个新元素采用新的大小和默认值。当我运行该程序时,我看到:012...199200Resizing201为什么在调整大小后只插入了1个项目? 最佳答案 当添加的条目是复制构造时,您只能看到来自默认构造函数的计数。您还必须添

c++ - 如何更改 C++ 中的 vector 项?

我有一个C++结构vector,我想单独修改每个项目。我发现执行SomeStructinfo=myVector[i]会给我一个项目的拷贝,所以如果我修改它,什么都不会改变。所以现在我正在像这样重置项目:myVector[i]=info。有没有更有效的方法呢?一个不涉及复制操作的?这是我当前的代码:structCharacterInfo{QCharcharacter;intoccurrences;doublefrequency;};std::vectorcharacterInfos;//Somecodetopopulatethevectorfor(unsignedi=0;i

c++ - 如何将 vector<int> 转换为 int*

我必须维护一个自2004年以来就没有人碰过的程序。classCSolver{...ClauseIdxadd_clause(int*lits,intn_lits);}voidand2(CSolver&solver){vectorlits;...solver.add_clause(lits.begin(),lits.size());}编译器提示:error:nomatchingfunctionforcallto‘CSolver::add_clause(__gnu_cxx::__normal_iterator>>,size_t)’我试着施放它solver.add_clause((int*)l

c++ - *(int*) 在 C++ 中是什么意思?

我在OpenGL教程中遇到了以下行,我想知道*(int*)是什么意思,它的值是什么if(*(int*)&(header[0x1E])!=0) 最佳答案 让我们一步一步来:header[0x1E]header必须是某种数组,这里我们获取对数组中第0x1E元素的引用。&(header[0x1E])我们获取该元素的地址。(int*)&(header[0x1E])我们将该地址转换为指向int的指针。*(int*)&(header[0x1E])我们取消引用指向int的指针,通过解释header的第一个sizeof(int)字节产生一个int,

c++ - 用 0's if it' 填充 vector 而不是 8 的倍数

如果vector不是8字节的倍数,我如何用0填充它?在下面的代码中,我计算出偏移量并将其添加到vector中以确保它始终具有8个值。我想用0来填充它,我想知道最有效的方法是什么。例如:输入:4444带填充:4444000000000000我目前的代码是:if((vector1.size()%8)!=0){for(std::vector::iteratoritr=vector1.begin();itr!=vector1.end();itr++){vector1.push_back(fmod(vector1.size(),8));if(vector1.size()==8)break;}}

c++ - 为什么我不能将 std::begin/std::end 与 int(*p)[3] 一起使用,而我可以与 int(&p)[3] 一起使用?

这个有效:voidfoo(int(&a)[3]){autoibegin=begin(a);autoebegin=end(a);}虽然这不是:voidfoo(int(*a)[3]){autoibegin=begin(a);autoebegin=end(a);}我认为int(&a)[3]和int(*a)[3]是同一个意思! 最佳答案 您的代码类似于:voidfoo(vector&a){autoibegin=begin(a);autoebegin=end(a);}voidfoo(vector*a){autoibegin=begin(a);

c++ - 在 C++ 中,我希望我的接口(interface) .h 说 int GetSomeInt() const;.... 但实际上方法 *DOES* 更新 "this"。

我正在向const方法添加一些惰性初始化逻辑,这使得该方法实际上不是const。有没有办法让我不必从公共(public)界面中删除“const”就可以做到这一点?intMyClass::GetSomeInt()const{//lazylogicif(m_bFirstTime){m_bFirstTime=false;Dosomethingonce}returnsomeint...}编辑:“可变”关键字在这里起作用吗? 最佳答案 使m_bFirstTime可变:classMyClass{::mutableboolm_bFirstTime

c++ - std::vector 中的值传播

如果我有一个像这样初始化的std::vector:012345我怎样才能最好地将4传播到第一位?IE。我希望std::vector处于这种状态:401235删除4并重新插入它可能很昂贵,因为在前面插入是O(N),我相信。我正在考虑在连续位置交换值(例如冒泡排序),但这也是O(N)。使用另一个容器,如std::list是唯一的方法吗?编辑:在看到一些困惑之后,让我澄清一下,我的目标是在std::vector中已知任意位置的值前面加上std中另一个已知位置的值::vector。 最佳答案 即使有一个可接受的答案,正常的C++方法也是使用