打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++语言编程技巧:普通数组和vector数组一起使用的方法

引言

vectorC++标准模板库中提供的一种能够操作多种数据结构的向量容器模板类。相对于C++语言中的普通数组,vector除了数组的大小可根据元素个数的多少动态改变外,它更大的优势或者说更吸引我们的是,它内部提供了大量的优化算法,如排序、查找、删除/替换、数值运算等等。另外,同普通数组一样,vector数组中内部元素采用的是连续存储空间来存储的,所以,也可以通过下标来访问其中的某个元素。

那么,对于我们程序中定义的普通数组,能不能将其转换为vector数组,或者说与vector数组混合使用,并利用它内部提供的各种算法呢?这种需求场合还是挺多的,如我们可能会写某个算法函数,然后将其封装成动态链接库DLL文件供其它程序调用。在DLL函数的参数类型定义中,一般我们不会将其定义成c++语言专用的如classvector等类型,而是定义成通用的数据如intdouble等类型,否则,在其它语言如pythonLabVIEW等环境中调用DLL的时候,将不能正确识别参数的数据类型。

解决思路

实现将普通数组转换为vector数组并利用它内部提供的各种算法的目的,这里面涉及到两个重要环节:

怎样将普通数组的值传递到vector数组中?

使用vector的提供的各种算法进行处理后,得到的是vector类型的数组,怎么将其再转换为普通数组?

下面对这两个问题逐步说明。

普通数组转换为vector数组

假定普通数组为a定义为:double a[N]N为元素个数,转换后的vector数组定义为vector<int> v,则将a的所有元素传递到v的方式有以下两种:

1. 定义v时直接赋值,代码为:

vector<int> v(a, a+N);

2. 先定义v,其元素个数为N,再使用memcpya的值拷贝到v中,代码为:

vector<int> v(N);

memcpy(&v[0], a, sizeof(a));

2种方法能实现的原因是,vector数组中内部元素采用的是连续内存空间存储的,所有只要找到第一个元素的地址即&v[0]后,即可用memcpya中所有的元素拷贝到v中。

vector数组转换为普通数组

将处理后的vector类型的数组再转换为普通数组,可参考上面的第2种方法,用memcpy函数即可实现,代码如下:

memcpy(a, &v[0], sizeof(a));

代码测试实例

下面通过一个例子说明上面思路的可行性,例子中综合使用了普通数组和vector数组,代码如下:

 

  

主要代码部分说明如下:

1. 1-5行,包含的相关头文件,使用vector数组必须包含<vector>,程序中使用了其通用算法和数值运算,所有也包含了<algorithm><numeric>

2. 7行,声明使用std名称空间

3. 8行,定义数组的大小N10个元素,注意,要加前缀定义为const常量整数,因为后面定义普通数组大小时,其数组大小值必须为常数

4. 10-18行,定义一个子函数displayData,用于打印显示出数组中的所有元素

5. 22-27行,定义长度为10的普通数组a,并为每个元素赋值为0-100之间的随机整数

6. 30-32行,将普通数组的值传递给vector数组v,其中第30行是用的第1种方法,注释的31-32行是使用的第2种方法,这两种方法是完全等价的

7. 33行,使用vector数组的数值运算函数accumulate,计算数组a的所有元素之和并输出

8. 35-36行,使用vector数组的排序函数sort,对vector数组v中的元素进行排序并输出

9. 38-39行,将排序后vector数组的元素使用memcpy函数再传递到普通数组a中,并输出a中元素的值

经过上面的代码后,就完成了普通数组到vector数组的相互转换,其运行结果如下:

 

  

 

总结

从上面的例子中可看出,在一个程序中完全可以将普通数组和vector数组混合使用,充分利用C++模板库中提供的强大的函数库,来简化我们的程序代码,最后再将处理后的结果以普通形式的数组进行输出,以作它用。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
现代C++风格的新元素
折半查找算法
如何在C语言中实现简单的泛型编程(一)
解决内存泄漏问题
C++ STL轻松导学
十大经典排序算法(动态演示 代码)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服