问题描述
- 关于C++ vector中存放数组,出现问题
-
我想定义一个vector,里面放几个数组,每个数组长度为2,数组的值由控制台输入。
先定义两个整数M,N,N表示vector中数组的数目,M是另外一个整数,答主可以不必关心。
当M=N=-1时跳出循环。整数J,F是存储在数组中的值,也由控制台输入。
然后对vector排序,排序规则定义在cmp函数中,按照J/F的值由大到小排序。
比如:对于{[7,2],[4,3],[5,2]},排序后为{[7,2],[5,2],[4,3]}
代码如下:
#include
#include
#includeusing namespace std;
bool cmp(int a[],int b[]){
double k1=(double)(a[0]/a[1]);
double k2=(double)(b[0]/b[1]);
return k1<k2;
}int main()
{int M,N;
while(true){
cin>>M;
cin>>N;
if(M==-1 && N==-1)
break;
vector vec;
int arr[2]={};
for(int i=0;i
int J,F;
cin>>J;
cin>>F;arr[0]=J; arr[1]=F; vec.push_back(arr); } sort(vec.begin(),vec.end(),cmp); int b[2]={}; memcpy(b,vec.at(0),2); cout<<b[0]<<endl; } return 0;
}
最后输出第一个数组的第一个数时发现不是7,而是5.经过调试发现,当输入7,2时,vector中为[7,2],继续输入[4,3]时,vector中为[4,3],[4,3],也就是第一个数组被覆盖了,继续输入
[5,2]vector中都变成了[5,2],也就是都被[5,2]覆盖了,最后排序完了输出的自然是5.
但是我不知道为什么会被覆盖,求解答
解决方案
vec.push_back(arr);
这里数据保存的是arr的内存地址,仅接着arr就被释放了。这时vec中存的数据是无效的,再从里面取数据是不正确的。
可以将arr定义为结构体或者类
如:
class Num
{
int n1;
int n2;
};
定义数组
vector vec;
当然也可以考虑在堆上申请内存再释放
解决方案二:
首先,你需要搞清楚,C++中没有数组类型,所谓的数组是由指针来模拟的.
因此.变量attr是一个指针,你push进vector的其实是一个指针而不是数组. 每次循环你都是在修改attr指向的那一块内存区.
解决方案三:
你的代码没有贴全。不过看你给出的程序,应该不会出现覆盖呀。你确定是这个问题吗?
解决方案四:
attr不用数组,用string类型来保存数据。vector中也push进string
解决方案五:
建议是不要静态定义attr,而是每次循环时,都用new []分配一个新的内存块存放数组内容
解决方案六:
首先,数组的问题已经有人回答了。
其次,你这个比较功能明显是比较分数,第一个数相当于分子,第二个数相当于分母,所以写一个结构体吧,不要用数组表示。