将值从一个向量复制到另一个向量(从book)
Copying values from one vector to another (from book)
考虑这段代码。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int *> test;
vector <int *> v;
int *a = new int;
int *b = new int;
*a = 1;
*b = 2;
v.push_back (a);
v.push_back (b);
for (int i = 0; i < 2; ++i)
{
int n = *v[i];
test.push_back (&n);
}
cout << *test[0] << " " << *test[1] << endl;
delete a;
delete b;
return 0;
}
问题的语句是:
"给定这段代码,回答以下问题:
为什么"测试"向量只包含2 ?
我们如何改变for循环正确复制(只有代码内for循环)?"
这些问题我都答不上来,如果你能帮点忙,我将不胜感激。
这段代码引入了悬空指针。循环体看起来像这样:
{
int n = *v[i];
test.push_back (&n);
}
局部变量n
在循环体结束时失去作用域,因此指针&n
现在是一个悬垂指针。如果碰巧test
只包含2,这只是随机产生的未定义行为。
如果您想"正确"地将数据复制到test
,您可以将for
循环体更改为:
{
int* n = new int;
*n = *v[i];
test.push_back (n);
}
将两个指向n
的相同指针压入test
数组。n
等于第一个数组的最后一个元素。注意,控制流退出循环后,所有指向n
的指针都无效。所以,实际上你的test
数组包含无效指针,而不是指向2s的指针。
您应该创建每个整数的副本:
int* n = new int(*v[i]);
test.push_back (n);
还要注意这里存在内存泄漏。使用new
创建的每个int稍后应该使用delete
销毁。
第一个问题是一个技巧问题:vector包含指向一个不再存在的变量的指针,并且解引用可能导致几乎任何输出。我想在一些机器和编译器上,它会打印所有的2
s。
我不明白这个练习要做什么(例如为什么要使用指针的向量),所以我不能真正帮助如何解决这个问题。
一种方法是让test
按值存储:
首先将测试向量更改为vector <int> test;
然后将push_back更改为test.push_back (n);
之类的内容,最后将print语句删除现在不需要的*
操作符。
编辑注释:
首先,我怀疑这本书:它不应该展示未定义的行为或指向单个内置类型的原始指针。但是如果你愿意,你可以改变你的循环体:
for (int i = 0; i < 2; ++i)
{
int* n = new int;
*n = *v[i];
test.push_back (&n);
}
请注意,这两种方法都会导致内存泄漏,除非您稍后将这些指针delete
,按值存储可以消除这个问题。
我认为这个问题的前提是错误的。循环将两个元素添加到test
中,每个元素都包含自动变量n
的地址,其作用域限制在循环体中。不能保证n
在两次循环中都被分配到相同的内存位置,但我认为大多数编译器可能会在两次循环中重用相同的位置。
此外,n
在输出语句的作用域之外。因此,引用test
中的指针到这些内存位置是未定义的。同样,它们很有可能仍然包含在循环中分配的值。
因此,只有在第二次循环中为n
重用相同的位置,并且在执行输出语句时该位置没有被覆盖,输出才会是"22 2"。
2)为了得到输出"1 2"而不改变循环外的任何东西,可以将n
的定义更改为int& n = *v[i]
,这将是给定代码的单个字符更改,尽管最终结果相当奇怪。
一个更简单的解决方案是取消临时的n
,直接使用test.push_back(v[i])
。
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 如何避免将向量的完整值复制到另一个容器
- 如何将所有指针从一个向量移动到另一个向量?
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 用一个向量替换另一个向量的方法
- 如何根据另一个向量中给出的索引拆分向量?
- 如何在另一个类中调用类型类的向量?
- 按另一个向量对一个向量进行排序
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- 如何设置一个 std::vector 与另一个,其中两个是不同类的向量?