草庐IT

C++:指针 vector 在 push_back() 之后失去引用

在我的代码中,a有一个Node对象的全局vector和一个Node指针的局部vector:#include#include#includeusingnamespacestd;classNode{intn;public:Node(inti):n(i);intgetN(){returnn;}};vectorv;intmain(){vectorp;v.push_back(Node(1));p.push_back(&v[0]);printf("firstnodeid:%d\n",(*p[0]).getN());return0;}我将一个节点对象插入到全局vector中,并将该对象的指针插入到本

c++ - 在 vector::push_back 内存明智的情况下会发生什么?

我的问题是关于vector::push_back的效果,我知道它在vector末尾添加了一个元素,但是在引擎盖下会发生什么?IIRC内存对象是按顺序分配的,所以我的问题是vector::push_back是否只是在vector之后立即分配更多内存,如果是这样,如果没有足够的可用内存会发生什么情况在那个位置?或者也许在“结束”中添加了一个指针以使vector“跳跃”到它继续的位置?或者它只是通过将其复制到另一个有足够空间的位置而重新分配并且旧拷贝被丢弃?还是别的什么? 最佳答案 如果已经分配了足够的空间,则对象是从就地参数构造的拷贝。

c++ - std::vector::push_back 的成本是成功还是无效?

如果我理解正确,std::vector::insert不保证std::vector的提交或回滚s(出于明显的原因,它适用于std::lists)在复制或移动期间抛出异常的情况下,因为检查异常的成本很高。我最近看到push_back确实可以保证最后插入成功或什么也没有发生。我的问题如下。假设在push_pack期间必须调整vector的大小(发生重新分配)。在这种情况下,必须通过复制或移动语义将所有元素复制到新容器中。假设移动构造函数不能保证noexcept,那么std::vector将使用复制语义。因此,为了保证push_pack的上述行为,std::vector必须检查复制是否成功,

c++ - 二维 vector push_back

我有一个由其他vectorB组成的二维vectorAvector>AvectorB我使用push_back函数来填充B。B.push_back(1);B.push_back(2);B.push_back(3);填充该vector后,我再次使用push_back用B填充AA.push_back(B)这会重复多次,因此A最终会生成一个包含多个其他vector的vector,如下所示:A{{1,2,3},{2,2,2},{8,9,10}}如何调用A中的特定索引,然后继续添加到vector中,以便输出类似于A{{1,2,3},{2,2,2,4,5,6},{8,9,10}}类似A[2].push

c++ - 为什么 vector<> 和 list<> 容器中的 push_back 不返回对插入元素的引用?

我意识到我可以通过调用back()来获取iterator引用,但为什么不使用push_back()来返回它呢?是出于性能原因吗?还是由于异常安全(类似于为什么pop_back()不返回弹出值)?无论哪种情况,请解释一下。 最佳答案 各种insert函数返回一个迭代器的原因很简单:调用者不一定知道如何获取该元素的迭代器。map::insert和set::insert返回一个,否则调用者将不得不搜索元素。当您执行vector::push_back时,您知道插入的元素在哪里。它是--vector.end()。您不必搜索它;总是那个位置。你

C++:push_back(new Object()) 是内存泄漏吗?

以下C++代码是否存在内存泄漏?list.push_back(newString("hi"));据我了解,任何std集合/容器中的push_back总是会制作拷贝。因此,如果复制了新字符串,则没有什么可以删除新字符串,对吧?因为push_back之后没有引用它...我是对还是错?谢谢。Jbu编辑:我想我错了,因为new将返回一个指针......我们将始终拥有能够删除新字符串的指针 最佳答案 是的,但不是你想的那样。取决于如何list已定义并初始化,push_back可能会抛出异常。如果是,则从new返回的指针迷失了,永远无法解脱。但

c++ - 带有 std::make_unique 的 push_back 或 emplace_back

基于these中的答案questionshere,我知道使用c++14的std::make_unique肯定比直接emplace_back(newX)更可取。也就是说,是不是更喜欢打电话my_vector.push_back(std::make_unique("constructor","args"));或my_vector.emplace_back(std::make_unique("constructor","args"));也就是说,在添加由std::make_uniquestd::unique_ptr时,我应该使用push_back还是emplace_back/?====编辑=

C++11 vector push_back 不明确

考虑以下代码:#includestructS{inta;doubleb;};intmain(){std::vectorv;v.push_back({3,4.5});}g++4.4提示对push_back()的调用不明确:error:callofoverloaded‘push_back()’isambiguousnote:candidatesare:voidstd::vector::push_back(const_Tp&)[with_Tp=S,_Alloc=std::allocator]note:voidstd::vector::push_back(_Tp&&)[with_Tp=S,_A

c++11 emplace_back 和 push_back 语法与结构

我正在使用MSVC,VisualStudio2013。假设我有一个结构:structmy_pair{intfoo,bar;};我想有效地添加一堆这些,而不是创建一个临时然后丢弃它:vectorv;v.push_back(41,42);//doesnotwork[a]v.push_back({41,42});//works[b]v.emplace_back(41,42);//doesnotwork[c]v.emplace_back({41,42});//doesnotwork[d]v.emplace_back(my_pair{41,42});//works[e]现在,如果我在代码中添加构

c++ - std::forward_list 和 std::forward_list::push_back

我想使用std::forward_list因为:Forwardlistisacontainerwhichsupportsfastinsertionandremovalofelementsfromanywherefromthecontainer但是没有*std::forward_list::push_back*实现。是否有一种高性能的方式来添加对单或无理由的支持? 最佳答案 我建议反对std::forward_list就像我在几乎所有情况下反对std::list一样。就个人而言,我从来没有在我的代码中发现链表是最好的数据结构。在C++