2 duanmucheng duanmucheng 于 2015.05.31 10:10 提问

关于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
#include

using 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.
但是我不知道为什么会被覆盖,求解答

6个回答

wlj1234
wlj1234   2015.05.31 12:02

vec.push_back(arr);
这里数据保存的是arr的内存地址,仅接着arr就被释放了。这时vec中存的数据是无效的,再从里面取数据是不正确的。
可以将arr定义为结构体或者类
如:
class Num
{
int n1;
int n2;
};
定义数组
vector vec;
当然也可以考虑在堆上申请内存再释放

duanmucheng
duanmucheng 哥哥,你讲的很有道理,情况确实是这样的
接近 3 年之前 回复
lujun9972
lujun9972   2015.05.31 17:07

首先,你需要搞清楚,C++中没有数组类型,所谓的数组是由指针来模拟的.
因此.变量attr是一个指针,你push进vector的其实是一个指针而不是数组. 每次循环你都是在修改attr指向的那一块内存区.

autocyz
autocyz   2015.05.31 12:01

你的代码没有贴全。不过看你给出的程序,应该不会出现覆盖呀。你确定是这个问题吗?

oyljerry
oyljerry   Ds   Rxr 2015.05.31 15:15

attr不用数组,用string类型来保存数据。vector中也push进string

lujun9972
lujun9972   2015.05.31 17:12

建议是不要静态定义attr,而是每次循环时,都用new []分配一个新的内存块存放数组内容

u012061345
u012061345   2015.06.01 11:12

首先,数组的问题已经有人回答了。

其次,你这个比较功能明显是比较分数,第一个数相当于分子,第二个数相当于分母,所以写一个结构体吧,不要用数组表示。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!