静态数组的缺点
数组是我们用的非常多的一种数据结构.存储一组对象时首先想到的就是用它.它的优点一个是因为在内存中连续分配,所以通过下标索引访问非常快.二个是使用简单,取值赋值修改都很方便.
C++中我们一般像这样定义一个数组int NumArr[] = {1,2,3}; //或者int NumArr[3] = {1,2,3};
而C#中是这样int[] NumArr = {1,2,3};
静态数组最大的缺点就是定义的时候大小是固定了的(显式指定大小,或者编译器通过赋值元素数量推算出具体大小).这样一来我们要存储一些大小不固定的一组对象时就麻烦的.一个比较笨的办法是预先做下估计,然后定义个比较大点的数组.这样很容易造成内存浪费.而且特殊情况下保存的数据仍然会超出数组的范围.
动态数组
针对数组大小固定的缺点弄出了个动态数组.在C++的STL中叫vector ,在C#中叫List.两者都有用到泛型技术.
动态数组涉及到的主要操作主要是:赋值(添加),插入,查询,删除,遍历,排序
C++ STL中vector用法
引用头文件
#include <vector>
#include <algorithm>
using namespace std;
vector<int> vec; //定义一个int型的动态数组
vec.push_back(1); //往数组中添加元素1,不知道为啥不用个add来代表添加元素
vec.push_back(2);
vec.push_back(4);
vector<int>::iterator it = vec.begin(); //iterator迭代器可以简单理解为类似指向元素位置的指针.这里表明是起始位置
vec.insert( it + 2, 3); // 在第三个元素前面插入3,也就是要在4前面插入3.
int num = vec[2]; //num的值为3
num = vec.at(2); //num的值为3
///三种遍历数组的方法
for(vector<int>::size_type i = 0; i < vec.size(); i++) //遍历整个数组 ,方法1
cout<<vec[i]<<endl;
for(it = vec.begin(); it != vec.end(); it++) //遍历整个数组 ,方法2
cout<< *it <<endl;
for_each(vec.begin(), vec.end(), Show); //遍历整个数组 ,方法3
//函数Show一定义如下
//void Show(const int num){ cout<<num<<endl;}
/
vec.pop_back(); //删除数组最后一个元素
it = vec.begin(); //因为前面迭代器操作过后会失效,需要重新赋值.
vec.erease(it + 1); //删除指定位置元素
vec.clear(); //删除所有元素
sort(vec.begin() , vec.end()); //排序
C#中List用法
实际上C#中还有个叫arraylist的动态数组,但没有用到泛型技术,数组里面只能保存一个个的object类型,需要自己去做些类型转换.
引用命名空间
using System.Collections.Generic
List<int> array = new List<int>();
array.Add(1); //添加元素
array.Add(2);
array.Add(4);
for (int i = 0; i < array.Count; i++) //遍历整个数组,方法1
Console.WriteLine(array[i]);
List<int>.Enumerator it = array.GetEnumerator(); //遍历整个数组,方法2
while (it.MoveNext())
Console.WriteLine(it.Current);
foreach (int item in array) //遍历整个数组,方法3
Console.WriteLine(item);
array.Insert(3, 3);
int num = array[2]; //结果为3
array.RemoveAt(2); //删除索引为2的元素
array.Clear(); //清除所有元素
array.Sort(); //排序