C++中容器的范围
Scope for containers in C++
假设我有一段类似于以下代码的内容:
int main() {
vector< vector<int> > vecs;
int n_vecs;
cin >> n_vecs;
for (int i = 0; i < n_vecs; i++) {
int n_nums;
cin >> n_nums;
vector<int> tmp;
for (int j = 0; i < n_nums; i++) {
int num;
cin >> num;
tmp.push_back(num);
}
vecs.push_back(tmp);
}
}
逐渐填充vector<int>
s 的向量。从一些测试用例中,我了解到在for
循环完成后,向量是按预期构造的。但是,我不明白为什么会这样:tmp
向量不应该是 外部for
循环完成后超出范围?它的副本是否会插入到vecs
向量中?(这同样适用于map
秒)
是的,制作了一份副本。有关push_back
,请参阅文档:
新元素初始化为值的副本
该函数有两个重载。在您的示例中,选择void push_back( const T& value )
重载是因为您正在传递一个命名对象并且尚未应用std::move
,因此需要复制。
如果您传递了一个未命名的对象或应用了std::move
,则将选择另一个重载,"窃取"tmp
的内容以在vecs
向量末尾初始化新对象。
但这甚至对你的问题无关紧要。无论哪种情况,tmp
的生命周期在之后结束(因为它在源代码中的范围)这一事实都是无关紧要的。vecs
向量已经包含并拥有一个新元素,tmp
发生的事情与它无关。
也许要记住的最重要的事情是,C++标准容器的设计使您可以像普通int
一样轻松地使用它们。您可以复制它们,返回它们,传递它们并分配它们,结果将始终符合预期。这是因为C++标准容器拥有其内容。
它的副本是否入到 vecs 向量中?
是的。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何访问超出其块范围的对象?
- 矢量下标超出SFML游戏中的范围