在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。
1 基本操作
(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
2
vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:
#include<stdio.h>#include<algorithm>#include<vector>#include<iostream>using namespace std; typedef struct rect { int id; int length; int width; //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。 bool operator< (const rect &a) const { if(id!=a.id) return id<a.id; else { if(length!=a.length) return length<a.length; else return width<a.width; } } }Rect;int main() { vector<Rect> vec; Rect rect; rect.id=1; rect.length=2; rect.width=3; vec.push_back(rect); vector<Rect>::iterator it=vec.begin(); cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; return 0; }
3 算法
(1) 使用reverse将元素翻转:需要头文件#include<algorithm>
reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,
一般后一个都不包含.)
(2)使用sort排序:需要头文件#include<algorithm>,
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。
C#中的List的详细用法
前言:
List泛型集合是C#编程中的经常使用的集合之一,相对数组它可以动态的添加元素而不是声明的时候就必须指定大小。相对于ArrayList集合和Hashtable集合的优势是其元素的数据类型可以确定。而不是默认的父类类型object。
List泛型集合的声明与元素添加
1.List泛型集合的声明:
List<数据类型> 变量名=new list<数据类型>();
2.List泛型集合的声明案例:
//声明一个List泛型集合的变量listNew
List<string> listNew=new List<string>();
注意:
1,以上代码声明的是一个string类型的泛型集合,其元素必须都为string型。
2,可以声明其他元素的泛型集合,只需要将string改成对应类型便可。
3.List泛型集合添加元素的Add()方法:
代码案例:为第二步声明的集合添加五个元素:
listNew.Add("一号元素");
listNew.Add("二号元素");
listNew.Add("三号元素");
listNew.Add("四号元素");
listNew.Add("五号元素");
说明:
1,List泛型集合只能使用Add()方法添加元素,不能直接指定下标赋值如:“listnew[0]="一号元素";”这样的语句是不合法的。因为List泛型集合在声明之后没有添加元素之前是空的,直接指定下标赋值会导致索引超出范围。
2,一旦元素添加成功,指定下标修改集合中的元素,如在这个声明例子中我们可以将"二号元素"改成任何字符串,如“你好”。
listNew[1]="你好";
3,List泛型集合和数组一样,其下标是从0开始的。
因为元素是字符串,我们也可以添加一个字符串数组在集合中,使用AddRange()方法便可:
案例)为listNew集合添加一个字符串数组
代码:
//声明一个字符串数组,有三个字符串元素
string[] str=new string[]{"六号元素","七号元素","八号元素"};
//使用AddRange()方法将元素添加到集合中
listNew.AddRange(str);
//添加成功
添加完成之后该集合便有了8个元素。
List泛型集合的常用属性
1.Count属性
返回List泛型集合中元素的数量。
如我们对上面已经添加过元素的集合获得其Count属性值
Console.WriteLine(listNew.Count); //输出ListNew集合的元素数量
输出值为:5
2.Capacity属性
返回在不增加大小的情况下目前List泛型集合的容量
List泛型集合在添加元素的时候容量是变化的,其过程(原理)如下:
当添加元素的时候集合的容量不足以容纳所有元素就会自动增加目前元素数一倍的容量。
所以在上面的例子中listNew集合的容量的增加过程如下:
添加第一个元素的时候Capacity的值为1;
添加第二个元素的时候Capacity的值为2;
添加第三个元素的时候Capacity的值为4;
添加第四个元素的时候Capacity的值为4;
添加第五个元素的时候Capacity的值为8;
List泛型集合的常用方法:
1.Add()方法,添加元素的方法,前面已经讲过
2.Clear()方法,无返回值,清空集合中的所有元素
案例:清空ListNew集合中的所有元素
listNew.Clear();
3.Contains()方法,返回布尔型数据,参数为集合中元素的数据类型
功能:检查集合中是否存在某元素
案例:检查listNew集合中是否存在字符串元素"一号元素"。
代码:listNew.Contains("一号元素");
返回值为:true。
4.Equals()方法
比较两个List泛型集合是否相等
举例,比较listNew集合与listold集合是否相等:
代码:listNew.Equals(listold); //本人就不声明listold集合了,理解Equals()方法即可。因为不常用。
5.Indexof()返回值为int,从索引位置0开始查找元素,并得到索引值
比如我们要在listNew集合中查找元素"四号元素"的第一个索引位置(考虑到有多个"四号元素的情况")
代码:
listNew.Indexof("四号元素");
返回值为:3。
6.Insert()方法,插入元素
如我们在listNew集合的索引位置3上插入"三点五号元素"
listNew.Insert(3,"三点五号元素");
插入后元素数量变为增加了1,原来索引3位置上的元素在索引位置4上了,后面的元素全部向后移动了一格。
7.Remove()方法,删除指定元素
如我们删除刚刚添加的"三点五号元素"
代码:listNew.Remove("三点五号元素");
删除这个元素之后后面的元素会上移一个索引位置
8.RemoveAt()方法,根据索引位置删除元素
如:我们删除当前三号索引位置处的元素
代码:listNew.RemoveAt(3);
删除这个元素之后后面的元素会上移一个索引位置。
9.Reserve()方法,将集合中的所有元素反向排序
如,我们将listNew集合中的所有元素反向排序
代码:listNew.Reserve();
反向排序之后集合中元素的索引会有改变
10.ToArray()方法,将集合转换为数组
如我们将listNew集合转换为一个string数组
string[] str=listNew.ToArray();