C语言进阶知识普通数组和vector

北京中科白癜风医院科学大讲堂 http://m.39.net/baidianfeng/a_8424854.html

引言

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

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

解决思路

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

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

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

普通数组转换为vector数组

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

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

vectorintv(a,a+N);

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

vectorintv(N);

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

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

vector数组转换为普通数组

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

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

代码测试实例

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

主要代码部分说明如下:

第1-5行,包含的相关头文件,使用vector数组必须包含vector,程序中使用了其通用算法和数值运算,所有也包含了algorithm和numeric第7行,声明使用std名称空间第8行,定义数组的大小N为10个元素,注意,要加前缀定义为const常量整数,因为后面定义普通数组大小时,其数组大小值必须为常数第10-18行,定义一个子函数displayData,用于打印显示出数组中的所有元素第22-27行,定义长度为10的普通数组a,并为每个元素赋值为0-之间的随机整数第30-32行,将普通数组的值传递给vector数组v,其中第30行是用的第1种方法,注释的31-32行是使用的第2种方法,这两种方法是完全等价的第33行,使用vector数组的数值运算函数accumulate,计算数组a的所有元素之和并输出第35-36行,使用vector数组的排序函数sort,对vector数组v中的元素进行排序并输出第38-39行,将排序后vector数组的元素使用memcpy函数再传递到普通数组a中,并输出a中元素的值

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

总结

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




转载请注明:http://www.aierlanlan.com/rzfs/3563.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了