草庐IT

stdvector

全部标签

c++ - std::vector insert() 重新分配

我查看了std::vector代码,发现了一些我不太明白的东西。当capacity分配新缓冲区复制旧缓冲区的前缀(0-插入索引)在新缓冲区中构造新元素复制旧缓冲区的后缀(index-end)对旧缓冲区中的所有项目调用析构函数释放旧缓冲区据我所知,前缀和后缀的复制是用memmove完成的。memmove不是数据的纯二进制拷贝吗?它不会调用元素的构造函数,是吗?我想知道的是,如果内存只是移动,而不是在新缓冲区中重新构造,为什么函数会调用旧缓冲区中元素的析构函数? 最佳答案 我查看了MSVC8vector实现-我看不到memmove().

c++ - 从带有原始指针的 vector 中删除 std::unique_ptr 的最佳方法?

所以我有一个像这样的vector:std::vector>myVector;然后我有另一个vector,其中包含SomeClass的原始指针:std::vectormyOtherVector;如果myOtherVector中有一个元素,它也会在myVector中,所以我想遍历myOtherVector中的每个元素并删除来自myVector的相同元素。然后清除vector。这是我想出的:for(size_ti=0;i这会产生编译时错误,因为myVector拥有唯一的指针,但我给remove()函数一个原始指针。这是我需要帮助的地方,因为我不知道解决这个问题的正确方法是什么。我将行更改为:

c++ - 遍历 vector 中的所有(无序)元素对

我有一些数据的std::vector(在我的例子中是点),我想遍历所有不同的元素对。对的顺序并不重要(因为我只对点的距离感兴趣)。使用经典的for循环,我想做的是:std::vectorvec{-1.,3.,5.,-8.,123.,...};for(std::vector::size_typefirst=0;first::size_typesecond=first+1;second我现在的问题是,是否可以使用基于范围的循环更优雅地实现这一目标。 最佳答案 我不会尝试将其强制转换为基于范围的循环(因为设计内部循环的开始会很棘手),但我

c++ - std::vector::erase(item) 需要为项目定义赋值运算符?

我有一个类C没有定义operator=.我正在尝试使用这样的vector:std::vector>vec;.现在,我的问题是完成后我无法删除这对。编译器提示缺少operator=对于C.我不能有一个没有这个运算符的类的vector吗?我该如何解决这个问题?我无法将作业添加到C.这是我得到的错误:errorC2582:'operator='functionisunavailablein'C'C:\...\include\utility1961my-lib这是我的代码:voidRemove(constC&c){autoi=cs_.begin();while(i!=cs_.end()){if

c++ - 包含未初始化值的对象 vector

此代码是否会导致未定义的行为:#includestructS{S(){}intx;};intmain(){std::vectorvec(5,S());}自S()默认初始化一个自动对象,它的内容不会先归零,所以x将是不确定的。然后将包含不确定值的对象复制到每个vector位置。动机:我们可能希望它的行为与std::vectorvec(5);相同这不是UB(C++11起),所以这是一个很容易不小心犯的错误。正如Praetorian在C++11之前的评论中提到的std::vectorvec(5);可以自由地进行5次默认初始化,或者对部分或全部项目使用复制构造函数。

c++ - std::vector<Foo> 当 Foo 的一些成员是引用时

只要有可能,我通常更喜欢使用引用而不是指针,在我看来,它使语法更清晰。在这种情况下,我有一个类:classFoo{public:Foo(Bar&bar):bar_(bar){}private:Bar&bar_;};operator=()被编译器隐含地删除了这样一个类,因为一旦设置了引用,它就不能改变(我可以在技术上定义我自己的不改变bar_,但这不是必需的行为,所以我宁愿如果我尝试分配一个foo,编译器会提示)。我需要的是std::vectorv;.这在C++11之前是不可能的,因为模板参数必须是CopyAssignable。事实上,当我调用v.push_back(Foo(bar));

c++ - 在类的构造函数中初始化由 vector 组成的矩阵

我正在尝试构建一个具有字符矩阵的游戏。我正在尝试使用vector的vector来构建我的矩阵。我的game.h有这个:#ifndefGAME_H#defineGAME_H//includesusingnamespacestd;classGame{private:introw;intcol;vector>*matrix;//otheratributtespublic:Game();~Game(){}//somefunctions};#endif在我的game.cpp中:Game::Game(){this->col=20;this->row=20;//Initializethematrix

c++ - 制作 std::vector capacity>=N 和 size=0 的最佳方法?

给定一个std::vector,其大小和容量可以是任意的,将其大小更改为0并将容量更改为至少N(给定数字)的最佳做法是什么?我的直接想法是:voidf(vector&t,intN){t.clear();t.reserve(N);}但是我注意到了Areallocationisnotguaranteedtohappen,andthevectorcapacityisnotguaranteedtochange(whenstd::vector::cleariscalled).所以我想知道当原始容量大于给定的N时如何避免重新分配? 最佳答案 w

c++ - 我如何在 C++ 中遍历集合?

简单地说,如果我有一个集合和vector,我该如何创建一个可以将两者作为参数处理的通用方法。我想做的就是遍历任一类型的集合。听起来应该是微不足道的,但我遗漏了一些东西。voidprintMeSomeStrings(somebaseclassstrings){for(auto&str:strings){cout在C#中,我会传递IEnumerable或类似的东西。然后我可以遍历集合。任何解释答案的一般阅读将不胜感激。 最佳答案 您可以使用模板。例如:#includetemplatevoidfoo(Cconst&c){std::cout

c++ - 当 vector 超出范围时防止数据被释放

有没有办法将std::vector中包含的数据(由T*data指向)的所有权转移到另一个构造中,从而防止在vector超出范围后“数据”成为悬空指针?编辑:我不想复制数据(这是一个简单但无效的解决方案)。具体来说,我想要这样的东西:templateT*transfer_ownership(vector&v){T*data=&v[0];v.clear();...//v;...//growvdynamicallydata=transfer_ownership(v);}...//dosomethingusefulwithdata(userresponsibleforfreeingitlate