c++-关于C++ vector中存放数组,出现问题

问题描述

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

解决方案

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 []分配一个新的内存块存放数组内容

解决方案六:

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

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

时间: 2024-09-15 16:34:23

c++-关于C++ vector中存放数组,出现问题的相关文章

c++-C++中vector容器存放字符串,输出错误

问题描述 C++中vector容器存放字符串,输出错误 #include<iostream> #include<vector> #include<string> using namespace std; int main() { vector<char*> Sentence; vector<char*>::iterator p; char ch[100]=""; while(cin.getline(ch,100,'n')) {

msdn-派生类存放在基类类型vector中,怎么用派生类的函数?

问题描述 派生类存放在基类类型vector中,怎么用派生类的函数? 我已经成功将派生类存放在基类类型的vector表中,也能定位位置,就是不知道怎么使用派生类的函数,只能用基类的函数,求解啊! #include#include#include#includeusing namespace std;class people{public: people() { name = new char[20]; code = 0; sex = new char[8]; number = new char[2

C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲

 使用C++风格的数组,不需要管理内存. array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include<iostream> #include<array> #include<vector>   //C++的标准库 #include<string>   //C++字符串 #include <stdlib.h>   using  std::array; //静态数组,栈上 using std::vector; //

数据-java中的数组的元素可以是Vector类型吗

问题描述 java中的数组的元素可以是Vector类型吗 现在要存储Vector 类型的数据,第一位的长度是已知的,但是二维的长度未知,请问 应该怎么定义呢? 解决方案 可以的,数组就是一个容器,至于里面是什么,就是你自己的事情了,只要想放就可以放 解决方案二: 可以定义vector类型的数组,就像是引用类型的数组一样. 解决方案三: 可以考虑使用向量类... 解决方案四: 楼主是不是想实现那种数组长度是动态的啊 解决方案五: java:数组类型

vector中保存字符指针的总结

vector< char * >奇遇 vector,相信接触过c++的开发人员都不陌生.可以简单的理解为其是能够动态扩展的数组.闲话少叙,接下来描述曾经遇到过的一个问题. 打算使用vector来保存一批字符串,自然而然的想到了使用如下方式: vector<char *> vchar; vchar用来保存字符串.先来个示例: int main() { vector<char *> vchar; vchar.push_back(const_cast<char *>

asp中利用数组实现数据库记录的批量录入方法

数据|数据库|数组 asp中利用数组实现数据库记录的批量录入方法(原创) 演示:http://www.zwtd.com/1/yanek/n/needdj2.asp <% rem 文章题目 asp中利用数组实现数据库记录的批量录入方法(原创)作者:yanek联系email:aspboy@263.net%> 包括两个文件 1.allneeddj.asp:实现表单的生成 2. allneeddjresult.asp 处理表单批量录入 3.hbedu.mdb :数据库文件 其数据库结构如下 provi

android 从资源中获取数组

   8.1.1.概述 除了在Java代码中定义数组,Android还提供了在资源中定义数组,然后在Java代码中解析资源,从而获取数组的方法. 实际开发中,推荐将数据存放在资源文件中,以实现程序的逻辑代码与数据分离,便于项目的管理,尽量减少对Java代码的修改. 8.1.2.在资源中定义数组 步骤1.在res/values文件夹下创建arrays.xml文件: 步骤2.在arrays.xml文件中创建一个数组,如下代码所示: <?xml version="1.0" encodi

在java中一维数组和二维数组有什么区别吗?

问题描述 在java中一维数组和二维数组有什么区别吗? 求大神指点java中一维数组和二维数组的区别,为什么一位数组是一行 二维数组可以定义多行 解决方案 如图黑色的是一维数组红色的是二维数组一维数组用来存数据二维数组用来存一维数组 解决方案二: JAVA中一维数组和二维数组的定义一维数组及二维数组的用法java中arraylist和一维数组二维数组的转换 解决方案三: 一楼正解,一维和二维的区别就是线和面的区别,一维的数组你就可以通过一个下标来准确定位,而二维的就需要有两个就像坐标系一样,一维

java中的数组类型的数据能存储到栈空间吗

问题描述 java中的数组类型的数据能存储到栈空间吗 我们知道堆空间存储大数据,栈空间的数据先进后出, java中的数组类型的数据能存储到栈空间吗 解决方案 基本类型产生了一个值存放在栈中,变量的值就是栈的地址处的值. 引用类型则产生了一个对象,存放在内存堆中,同时将内存堆对象的指针地址(引用地址)存放在了栈中,变量的值实际是栈中的引用地址. 解决方案二: java中所有对象和数组都是在堆上分配内存的,,栈内存用来存放局部变量 解决方案三: java 存储不同类型数据Java实现登录.注册(使用