Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 它的确切含义是什么;参数被复制(或移动)";在给定代码示例中的vector::push_back()中?_C++ - Fatal编程技术网

C++ 它的确切含义是什么;参数被复制(或移动)";在给定代码示例中的vector::push_back()中?

C++ 它的确切含义是什么;参数被复制(或移动)";在给定代码示例中的vector::push_back()中?,c++,C++,我道歉!错误与原始问题无关(现在删除)。我保留这个问题,因为这些评论在设计层面上非常有用,可以避免将来出现任何混乱 我试图弄清楚当存在嵌套容器时,复制的是什么 下面的代码段有一个向量stack*。我假设当指向堆栈的指针是指向向量的时候,内存地址被复制。然后,当您取消引用指针时,它将指向相同的堆栈。因此,如果在其指针指向向量之前将ints推到该堆栈,则之后仍然可以访问这些值 void SetOfStacks::push(const int\u val){ 如果(-1==活动\u堆栈|| (堆栈[活

我道歉!错误与原始问题无关(现在删除)。我保留这个问题,因为这些评论在设计层面上非常有用,可以避免将来出现任何混乱

我试图弄清楚当存在嵌套容器时,复制的是什么

下面的代码段有一个向量
stack*
。我假设当指向堆栈的指针是指向向量的时候,内存地址被复制。然后,当您取消引用指针时,它将指向相同的
堆栈
。因此,如果在其指针指向向量之前将
int
s推到该堆栈,则之后仍然可以访问这些值

void SetOfStacks::push(const int\u val){
如果(-1==活动\u堆栈||
(堆栈[活动堆栈]->size()==堆栈阈值){
std::stack*s=新std::stack();
//问题:如果s->push(_val)在s被推回堆栈之前发生。
//将其推回后,s将显示为空
堆叠。向后推_(s);
主动_堆栈++;
}
stacks[active_stack]->push(_val);//不允许对堆栈进行修改
//指针被推回后有效
}

这个问题在上面的代码中是作为注释写的

假定某些容器存储堆栈,如:

std::vector< std::stack<int> * > stacks;
大多数容器必须复制推送到其中的内容,但优化器通常会忽略这些副本。如果在向量中存储指向容器的指针的目的是避免复制推入其中的每个堆栈,那么这可能无关紧要。向量的功能类似于数组,如果省略了拷贝,就没有拷贝,没有性能影响,而是有一种更简单的存储策略

然而,可能还有其他原因。例如:

std::map< int, std::stack<int> > stacks;
std::mapstacks;
map的迭代器更为复杂,副本被频繁地丢弃。如果不复制的效果不产生任何结果,它们也可能被忽略,但这在地图上是很难依赖的。为此,最好使用共享的ptr来存储动态分配的堆栈,而不是堆栈

使用shared_ptr来存储容器的一个很好的理由是,类似于通过线程传递的列表,或者可以从一个容器中取出并放入另一个容器(交换容器)。唯一的方法是把容器当作一个可以从一个容器中拔出来并交给另一个容器的对象,如果容器是由SyrdypTR之类的东西所拥有的。< /P>
但是,更常见的情况是,此类容器是其他对象的成员,这些对象本身可能被共享的PTR“拥有”,从而产生类似的想法。

使用
new
分配动态数据结构是一个危险信号。为什么不将
堆栈的大小调整到更高一级(或者将空堆栈推回,这样就不必担心复制),然后直接推入存储在数据结构中的堆栈中呢。那么你就不必担心任何指针了。@NeilKirk,谢谢你的评论。您和JVene关于使用共享ptr的建议都比我文章中基于指针的设计要好。亲爱的@JVene,非常感谢您的回答!我已经学习了shared_指针一段时间了,但是在需要它的地方,我还没有习惯在代码中使用它。你的回答很好地解释了这个问题。至于
push()
stack
之前的
push_back()
stack
,我不确定我是否理解它。也许我对指针的了解存在根本性的缺陷:虽然
堆栈
按指针拥有堆栈,
堆栈[索引]
,当取消引用时,应该是动态分配的相同堆栈。因此,尽管实际的“堆栈”不属于
堆栈
,但在
push_back()
之前对
堆栈所做的更改仍应存在。但实际情况是,当
堆栈[index]
被延迟时,以前的
push()
'd值就消失了。@K.G.以前推过的值是什么?当新堆栈被推入堆栈时,它是空的。结果应该是stacks[active_stack]准确返回刚刚推送的堆栈,并返回空堆栈。您如何看到以前推送的材料消失了?你能在原始问题中举个例子来澄清这一观点吗?我很抱歉。经过仔细调试,我发现由于
活动_堆栈
堆栈
的实际索引不一致,在其他地方生成了错误。我会回去编辑我原来的帖子。感谢您对shared_ptr及更多内容的评论!听起来像我期望的那样。很高兴这有帮助。
std::vector< std::shared_ptr< std::stack<int>> > stacks;
if (...whatever...)
    { 
        std::shared_ptr<stack<int>> s( new std::stack<int>() );

        stacks.push_back(s);
        active_stack++;
    }

    stacks[active_stack]->push(_val); 
std::vector< std::stack<int> > stacks;
std::map< int, std::stack<int> > stacks;