1.JavaVector的相关知识是什么
Vector 类可以实现可增长的对象数组。
与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。
Vector继承自AtrastractList,实现了 Serializable, Cloneable, Iterable, Collection, List, RandomAccess 的接口。 每个Vector会试图通过维护 capacity 和 capacityIncrement 来优化存储管理。
capacity 始终至少应与向量的大小相等;这个值通常比后者大些,因为随着将组件添加到向量中,其存储将按 capacityIncrement 的大小增加存储块。 应用程序可以在插入大量组件前增加向量的容量;这样就减少了增加的重分配的量。
构造函数Vector(),实现一个空向量,其内部数组大小为10,标准容量增量为0。 目前看来,Vector和ArrayList很像,二者的区别可参见以下比较 Vector 和 ArrayList的不同 有的时候 Vector更好一些;有的时候ArrayList 更好一些;有的时候你一个也不想用。
但愿,你不是在期望一个简单明了的答案,因为答案因你在用他们做什么而定。下面是要考虑的四个方面: API 同步-Synchronization 数据增长-Data growth 使用方法-Usage patterns 让我一个一个来解释吧。
API 在The Java Programming Language (Addison-Wesley, June 2000) 中Ken Arnold, James Gosling, 和 David Holmes 是这样描述Vector的,它是更ArrayList类似的一个东西,所以从API的观点来看,它们俩是很相似的。 但是,它们之间还是有些微的差别的。
Synchronization Vectors是可同步化的,意思就是说,任何操作Vector的内容的方法都是线程安全的,相反的,另一方面,ArrayList是不可同步化的,所以也不是线程安全的。如果你知道了这些的话,你就会发现,Vector的同步会让它在性能发方面有一些小问题。
所以,如果你不需要线程安全的话,那么就使用ArrayList吧。为什么要为没有必要的同步付出代价呢? Data growth 实际上,不管是ArrayList还是Vector,在它们内部都是使用一个Array来保存数据的。
编程过程中,在使用它们任何一个的时候,你都需要记住这一点。 你在往一个ArrayList或者Vector里插入一个元素的时候,如果内部数组空间不够了,这个对象(译者按:指的是你使用的ArrayList或者Vector)就要扩展它的大小。
Vector在默认情况下是产生一个双倍大小,而ArrayList增加50%的大小。 只要你合理的使用这些类,你就可以结束你在增加新的元素的时候所付出的性能代价。
把对象(译者按:指的是你使用的ArrayList或者Vector)的初始化容量指定为你编程过程中所能用到的最大的容量总是最好的办法。仔细的指定容量,你可以避免以后改变内部Array容量,所要付出的代价。
如果你并不知道到底有多少个数据,但是你知道数据的增长率,Vector确实有一点点优势,因为你可以指定增加值(译者按,如果没有猜错的话,作者说的方法应该是setSize(int newSize) Sets the size of this vector。 )。
Usage patterns ArrayList和Vector在从指定位置取得元素,从容器的末尾增加和删除元素都非常的有效,所有的这些操作都能在一个常数级的时间(O (1))内完成。但是从一个其他的位置增加和删除一个元素就显得颇为费时,差不多需要的时间为O(n-i),这里的n代表元素个数,i代表要增加和删除的元素所在的位置。
这些操作需花费更多的时间,因为你需要挨个移动i和更高位置的元素。那么,以上这些到底说明了什么呢? 这意味着,如果你取得一个元素,或者从数组末尾增加或删除一个元素的话,随便你使用Vector和ArrayList。
如果你想要对数组内容做其他操作的话,那么就为自己找另一个容器吧。 比如说,LinkedList可以在常数级时间(O (1))内为任意一个位置的元素增加和删除。
但是,取得一个元素,会稍微慢一点,时间要用O(i) ,这个i是元素的位置。通过ArrayList也是很简单的,因为你可以简单使用一个索引,而不是构造一个iterator 。
LinkedList也为每个插入的元素建立一个内部对象。所以,你也必须知道,同时产生了垃圾对象。
最后,Practical Java (Addison-Wesley, Feb。 2000) Peter Haggar 里的“实践41“建议你使用一个普通的原始的数组来代替Vector和ArrayListe,特别是对效率优先的代码来说。
通过使用数组(array),你可以避免同步,额外的方法调用,非理想化的大小改变。你付出的只是额外的开发时间。
更多考试辅导资料请关注考试大java认证站点。
2.vector使用大全, 资料
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 为了可以使用vector,必须在你的头文件中包含下面的代码: #include vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector vInts; 或者连在一起,使用全名: std::vector vInts; 建议使用全局的命名域方式:using namespace std; 函数 表述 c.assign(beg,end)c.assign(n,elem) 将[beg; end)区间中的数据赋值给c。
将n个elem的拷贝赋值给c。 c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back() 传回最后一个数据,不检查这个数据是否存在。 c.begin() 传回迭代器中的第一个数据地址。
c.capacity() 返回容器中数据个数。 c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。 c.end() 指向迭代器中末端元素的下一个,指向一个不存在元素。
c.erase(pos) c.erase(beg,end) 删除pos位置的数据,传回下一个数据的位置。 删除[beg,end)区间的数据,传回下一个数据的位置。
c.front() 传回第一个数据。 get_allocator 使用构造函数返回一个拷贝。
c.insert(pos,elem) c.insert(pos,n,elem) c.insert(pos,beg,end) 在pos位置插入一个elem拷贝,传回新数据位置。在pos位置插入n个elem数据。
无返回值。在pos位置插入在[beg,end)区间的数据。
无返回值。 c.max_size() 返回容器中最大数据的数量。
c.pop_back() 删除最后一个数据。 c.push_back(elem) 在尾部加入一个数据。
c.rbegin() 传回一个逆向队列的第一个数据。 c.rend() 传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num) 重新指定队列的长度。 c.reserve() 保留适当的容量。
c.size() 返回容器中实际数据的个数。 c1.swap(c2) swap(c1,c2) 将c1和c2元素互换。
同上操作。 vector cvector c1(c2) vector c(n) ector c(n, elem) vector c(beg,end) c.~ vector () 创建一个空的vector。
复制一个vector。创建一个vector,含有n个数据,数据均已缺省构造产生。
创建一个含有n个elem拷贝的vector。创建一个以[beg;end)区间的vector。
销毁所有数据,释放内存。 operator[] 返回容器中指定位置的一个引用。
创建一个vector vector容器提供了多种创建方法,下面介绍几种常用的。 创建一个Widget类型的空的vector对象: vector vWidgets; 创建一个包含500个Widget类型数据的vector: vector vWidgets(500); 创建一个包含500个Widget类型数据的vector,并且都初始化为0: vector vWidgets(500, Widget(0)); 创建一个Widget的拷贝: vector vWidgetsFromAnother(vWidgets); 向vector添加一个数据 vector添加数据的缺省方法是push_back()。
push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。例如:向vector中添加10个数据,需要如下编写代码: for(int i= 0;i<10; i++) { vWidgets.push_back(Widget(i)); } 获取vector中制定位置的数据 vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。
如果想知道vector存放了多少数据,可以使用empty()。获取vector的大小,可以使用size()。
例如,如果想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为-1,你可以使用下面的代码实现: int nSize = v.empty() ? -1 : static_cast(v.size()); 访问vector中的数据 使用两种方法来访问vector。 1、vector::at() 2、vector::operator[] operator[]主要是为了与C语言进行兼容。
它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。
由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下: 分析下面的代码: vector v; v.reserve(10); for(int i=0; i<7; i++) { v.push_back(i); } try {int iVal1 = v[7]; // not bounds checked – will not throw int iVal2 = v.at(7); // bounds checked – will throw if out of range } catch(const exception& e) { cout << e.what(); } 删除vector中的数据 vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当删除数据时,应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。 Remove_if()算法 如果要使用remove_if(),需要在头文件中包含如下代码:: #include Remove_if()有三个参数: 1、iterator _First:指向第一个数据的迭代指针。
2、iterator _Last:指向最后一个数据的迭代指针。 3、predicate _Pred:一个可以对迭代操作的条件函数。
条件函数 条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或是一个函数对象。这个函数对象需要支持所有的。
3.请问哪位朋友能介绍一下vc++中的vector的有关知识
#include // sort的定义#include // vector的定义#include // deque的定义#include // 同样,引入std命名空间using namespace std;// 用数组保存int friends[1000];// 用vector保存vector vtFriends;// 用deque保存deque dqFriends;int main(){ int T; scanf(“%d”, &T); int iCase; for (iCase = 1; iCase <= T; iCase++) { // 每次要将vector和deque请空 vtFriends.clear(); dqFriends.clear(); printf("Scenario #%d:n", iCase); int n, f, tn; scanf("%d%d", &n, &f); // 由于后面要找三次,所以先把n的值保存下来 tn = n; int i; for (i = 0; i = 0; i–) { n -= friends[i]; if (n = 0; i–) { n -= vtFriends.at(i); if (n = 0; i–) { // deque的at方法效率比vector低, // 因为deque的元素在内存上不完全是连续的 n -= dqFriends.at(i); if (n <= 0) break; } if (i < 0) puts("impossible"); else printf("%dn", f – i); puts(""); } return 0;}使用的我们学院一个牛人写的一篇东西哈,这里介绍vector,deque和sort的用法,这些都是STL的内容,给你一个网站吧,http://www.stlchina.org/;不过一般好像都不提倡一开始就在程序中使用STL,那些算法都自己写写最好,然后等学会了再用也会理解得更深入的。
4.有关向量vector的一些操作
vector常用操作1、创建容器格式 vector 容器标识符;几种初始化方法如下:vector ivec1;//空int容器vector ivec2(10);//包含十个默认int值的容器vector ivec3(10,2);//包含10个值是2的int的容器vector ivec(ivec1);//由ivec1创建副本的容器2、常用操作v.size() 返回容器大小v.push_back(int i)把i插入到容器后方==判断容器是否想等!=判断是否不等=v[n]返回容器内第n个元素v.empty()容器是否为空 若空返回true。
5.C++实习生面试,一般会问到关于STL的什么知识点
1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。
vector封装数组,list封装了链表,map和set封装了二叉树等2.标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-BlackTree)。RB树的统计性能要好于一般的 平衡二叉树3.STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: map: type pair ,很多不同的 const Key 对应的 T 对象的一个集合,所有的记录集中只要 const Key 不一样就可以, T 无关! set: type const Key. 只存单一的对 const Key ,没有 map 的 T 对像!可以看成 map 的一个特例(1)为何map和set的插入删除效率比用其他序列容器高?,树答:因为对于关联容器来说,不需要做内存拷贝和内存移动。
说对了,确实如此。map和set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点(2)为何每次insert之后,以前保存的iterator不会失效?答:iterator这里就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本身已经失效了)。
相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。
即使时push_back的时候,容器内部空间可能不够,需要一块新的更大的内存,只有把以前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后,那么以前的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator。
(3)为何map和set不能像vector一样有个reserve函数来预分配数据?答:我以前也这么问,究其原理来说时,引起它的原因在于在map和set内部存储的已经不是元素本身了,而是包含元素的节点。也就是说map内部使用的Alloc并不是map声明的时候从参数中传入的Alloc。
例如:4.set, multiset set和multiset会根据特定的排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。因为是排序的,所以set中的元素不能被修改,只能删除后再添加。
向set中添加的元素类型必须重载因为是排序的,所以map中元素的key不能被修改,只能删除后再添加。key对应的value可以修改。
向map中添加的元素的key类型必须重载vec(10) //一个有10个int元素的容器 vector vec(10, 0.5)//一个有10个float元素的容器,并且他们得值都是0.5 vector::iterator iter; for(iter = vec.begin(); iter != vec.end(); iter++) { //. . . . . . . }vector由于数组的增长只能向前,所以也只提供了后端插入和后端删除, 也就是push_back和pop_back。当然在前端和中间要操作数据也是可以的, 用insert和erase,但是前端和中间对数据进行操作必然会引起数据块的移动, 这对性能影响是非常大的。
最大的优势就是随机访问的能力。vector::iterator相关的方法有: begin():用来获得一个指向vector第一个元素的指针 end():用来获得一个指向vector最后一个元素之后的那个位置的指针,注意不是指向最后一个元素。
erase(vector::iterator):用来删除作为参数所传入的那个iterator所指向的那个元素。(2).list – 擅长插入删除的链表listMilkshakes; list Scores;push_back, pop_backpush_front. pop_frontlist是一个双向链表的实现。
为了提供双向遍历的能力,list要比一般的数据单元多出两个指向前后的指针一个使用iterator来删除元素的例子 list stringList; list::iterator iter; advance(iter, 5); //将iterator指向stringList的第五个元素 stringList.erase(iterator);//删除 那么删除操作进行以后,传入erase()方法的iterator指向哪里了呢?它指向了删除操作前所指向的那个元素的后一个元素。(3).deque – 拥有vector和list两者优点的双端队列(4).这三个模板的总结 比较和一般使用准则 这三个模板都属于序列类模板,可以看到他们有一些通用方法 size():得到容器大小 begin():得到指向容器内第一个元素的指针(这个指针的类型依容器的不同而不同) end():得到指向容器内最后一个元素之后一个位置的指针 erase():删除传入指针指向的那个元素 clear():清除所有的元素 ==运算符:判断两个容器是否相等 =运算符:用来给容器赋值 上面的三个模板有各自的特点 vector模板的数据在内存中连续的排列,所以随机存取元素(即通过[]运算符存取)的速度最快,这一点和数组是一致的。
同样由于它的连续排列,所以它在除尾部以外的位置删除或添加元素的速度很慢,在使用vector时,要避免这种操作。 list模板的数据是链式存储,所以不能随机存取元素。
它的优势在于任意位置添加 删除元素的速度。 deque模板是通过链接若干片连续的数据实现的,所以均衡了以上两个容器的特点。
6.向量的知识点
一、向量知识点归纳 1.与向量概念有关的问题 ⑴向量不同于数量,数量是只有大小的量(称标量),而向量既有大小又有方向;数量可以比较大小,而向量不能比较大小,只有它的模才能比较大小.记号“ > ”错了,而| |>| |才有意义. ⑵有些向量与起点有关,有些向量与起点无关.由于一切向量有其共性(大小和方向),故我们只研究与起点无关的向量(既自由向量).当遇到与起点有关向量时,可平移向量. ⑶平行向量(既共线向量)不一定相等,但相等向量一定是平行向量,既向量平行是向量相等的必要条件. ⑷单位向量是模为1的向量,其坐标表示为( ),其中 、满足 =1(可用(cos ,sin )(0≤ ≤2π)表示).特别: 表示与 同向的单位向量。
例如:向量 所在直线过 的内心(是 的角平分线所在直线);例1、O是平面上一个定点,A、B、C不共线,P满足 则点P的轨迹一定通过三角形的内心。 (变式)已知非零向量AB→与AC→满足(AB→|AB→| +AC→|AC→| )。
7.C++小问题,有关vector函数的
#include#include#includeusing namespace std;using std::vector;const int a=100;int main(){ int i,j; vector b; for(i=2;i<=a;i++) { if(i==2||i==3) { b.push_back(i); continue; } for(j=2;jsqrt(i+0.2)) b.push_back(i);//下面这两行无用 //if(i==6) // i=6; } for(i=0;i!=b.size();i++) cout<<b[i]<<endl; return 0;}。
8.有关向量的知识
定义 数学中,既有大小又有方向的量叫做向量(与矢量不同,没有起点终点)(英文:vector) 注:在线性代数中的向量是指n个实数组成的有序数组,称为n维向量。
α=(a1,a2,…,an) 称为n维向量.其中ai称为向量α的第i个分量。 (”a1″的”1″为a的下标,”ai”的”i”为a的下标,其他类推)。
在C++中,也有向量。 向量(或矢量),最初被应用于物理学.很多物理量如力、速度、位移以及电场强 向量度、磁感应强度等都是向量.大约公元前350年前,古希腊著名学者亚里士多德就知道了力可以表示成向量,两个力的组合作用可用著名的平行四边形法则来得到.“向量”一词来自力学、解析几何中的有向线段.最先使用有向线段表示向量的是英国大科学家牛顿. 从数学发展史来看,历史上很长一段时间,空间的向量结构并未被数学家们所认识,直到19世纪末20世纪初,人们才把空间的性质与向量运算联系起来,使向量成为具有一套优良运算通性的数学体系. 向量能够进入数学并得到发展,首先应从复数的几何表示谈起.18世纪末期,挪威测量学家威塞尔首次利用坐标平面上的点来表示复数a+bi,并利用具有几何意义的复数运算来定义向量的运算.把坐标平面上的点用向量表示出来,并把向量的几何表示用于研究几何问题与三角问题.人们逐步接受了复数,也学会了利用复数来表示和研究平面中的向量,向量就这样平静地进入了数学. 但复数的利用是受限制的,因为它仅能用于表示平面,若有不在同一平面上的力作用于同一物体,则需要寻找所谓三维“复数”以及相应的运算体系.19世纪中期,英国数学家哈密尔顿发明了四元数(包括数量部分和向量部分),以代表空间的向量.他的工作为向量代数和向量分析的建立奠定了基础.随后,电磁理论的发现者,英国的数学物理学家麦克思韦尔把四元数的数量部分和向量部分分开处理,从而创造了大量的向量分析. 三维向量分析的开创,以及同四元数的正式分裂,是英国的居伯斯和海维塞德于19世纪80年代各自独立完成的.他们提出,一个向量不过是四元数的向量部分,但不独立于任何四元数.他们引进了两种类型的乘法,即数量积和向量积.并把向量代数推广到变向量的向量微积分.从此,向量的方法被引进到分析和解析几何中来,并逐步完善,成为了一套优良的数学工具。
编辑本段表示 1、代数表示:一般印刷用黑体小写字母α、β、γ … 或a、b、c … 等来表示 向量表示,手写用在a、b、c…等字母上加一箭头表示。 2、几何表示:向量可以用有向线段来表示。
有向线段的长度表示向量的大小,箭头所指的方向表示向量的方向。(若规定线段AB的端点A为起点,B为终点,则线段就具有了从起点A到终点B的方向和长度。
向量的几何表示这种具有方向和长度的线段叫做有向线段。) 3、坐标表示: 1) 在平面直角坐标系中,分别取与x轴、y轴方向相同的两个单位向量i,j作为一组基底。
a为平面直角坐标系内的任意向量,以坐标原点O为起点作向量OP=a。由平面向量基本定理知,有且只有一对实数(x,y),使得 a=向量OP=xi+yj,因此把实数对(x,y)叫做向量a的坐标,记作a=(x,y)。
这就是向量a的坐标表示。其中(x,y)就是点P的坐标。
向量OP称为点P的位置向量。 2) 在立体三维坐标系中,分别取与x轴、y轴,z轴方向相同的3个单位向量i,j, k作为一组基底。
若a为该坐标系内的任意向量,以坐标原点O为起点作向量OP=a。由空间基本定理知,有且只有一组实数(x,y, z) 向量的坐标表示,使得 a=向量OP=xi+yj+zk,因此把实数对(x,y, z)叫做向量a的坐标,记作a=(x,y, z)。
这就是向量a的坐标表示。其中(x,y, z),也就是点P的坐标。
向量OP称为点P的位置向量。 3) 当然,对于空间多维向量,可以通过类推得到,此略.编辑本段向量简介 在数学中,通常用点表示位置,用射线表示方向。
在平面内,从任一点出发的所有射线,可以分别用来表示平面内的各个方向。向量的表示常用一条有向线段来表示,有向线段的长度表示向量的大小,箭头所指的方向表示向量的方向。
向量也可用字母a、b、c等表示,或用表示 向量机器模型向量的有向线段的起点和终点字母表示。向量的大小,也就是向量的长度(或称模),记作|a|长度为0的向量叫做零向量,记作0.长度等于1个单位长度的向量,叫做单位向量。
平行向量与相等向量 方向相同或相反的非零向量叫做平行向量。向量a、b、c平行,记作a∥b∥c。
0向量长度为零,是起点与终点重合的向量,其方向不确定,数学上规定0与任一向量平行。 长度相等且方向相同的向量叫做相等向量。
向量a与b相等,记作a=b。零向量与零向量相等。
任意两个相等的非零向量,都可用同一条有向线段来表示,并且与有向线段的起点无关。 向量空间的同构 在域F上的两个向量空间V与V’ ,如果存在一个双射φ:V→V’并且φ(αu+bv)=αφ(u)+bφ(v),a,b∈F,u,v∈V.这样V与V’ 便是同构。
向量线性映射 给两个向量空间V和W在同一个F场,设定由V到W的线性变换或“线性映射” . 这些由V到W的映射都有共同点就是它们保持总和及标量商数。这个集合包含所有由V到W的线性映像,以 L(V,W) 来描述,也是一个F场。