为啥这段代码可以正常工作? (vector.clear(), vector<vector<int>>)

Posted

技术标签:

【中文标题】为啥这段代码可以正常工作? (vector.clear(), vector<vector<int>>)【英文标题】:Why this code works fine? (vector.clear(), vector<vector<int> >)为什么这段代码可以正常工作? (vector.clear(), vector<vector<int>>) 【发布时间】:2015-08-28 15:13:10 【问题描述】:

这是我提交的代码的 sn-p。它起作用了,但它让我想到了 clear() 究竟是如何适用于矢量的。

vector<vector<int> > result;
vector<int> temp;
temp.push_back(1);
temp.push_back(2);
result.push_back(temp);
temp.clear();
temp.push_back(3);
temp.push_back(4);
result.push_back(temp);

//print result vector here.

为什么结果向量是[[1, 2], [3, 4]]

以下是cppreference 对vector.clear() 的评价:

从容器中移除所有元素。使任何引用无效, 指向包含元素的指针或迭代器。可能无效 任何过去的迭代器。留下向量的容量() 不变。

我怀疑不应依赖这种行为。

是否应该清除临时向量而不破坏内容?另外,cppreference 上的描述让我觉得插入 34 会导致它们覆盖 12,因为 temp 向量没有分配任何新内存?

这是 ideone 上的代码:https://ideone.com/Onwlro

【问题讨论】:

临时复制到结果中。是的,temp会被清空,elems会被删除,但是result中的副本不会被删除。 感谢您的评论。这就是我第一眼看到的东西。但我的印象是 push_back 应该只为 non-primitive 数据类型复制 temp 向量的指针引用。您能否提供一些参考以确保数据被逐个元素地复制? www.cplusplus.com/reference/vector/vector/push_back/ 【参考方案1】:

push_back 接受一个引用,但它复制了函数中传递的值。来自cppreference

void push_back( const T&amp; value );(1)

void push_back( T&amp;&amp; value );(2) (since C++11)

将给定的元素值附加到容器的末尾。

1) 新元素被初始化为 value 的副本。

2) 值被移动到新元素中。

由于它正在制作矢量的副本,因此当您调用 temp.clear() 时,result 中的矢量不会改变

【讨论】:

值得指出的是,这还取决于被推回的对象是否已实现了复制或移动构造函数以及赋值或移动运算符。

以上是关于为啥这段代码可以正常工作? (vector.clear(), vector<vector<int>>)的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码在 64 位架构上会出现段错误,但在 32 位上却能正常工作?

有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?

为啥这个python中最大的主要因素的代码不能正常工作

为啥我的 php 中的多语言网站不能正常工作?

C 中的这段代码决定一个数字是不是是素数,它会因大数而崩溃。为啥?

为啥这段SQL在Mysql中正常执行并有结果而在JDBC中却报异常?