vector在C++中的基本用法
在写BlackJackGame的时候,考虑到要用到容器,所以就对容器的相关知识强化了一下:
因为我想的是有card类,最后要实现发牌,洗牌等等一系列的操作的时候,使用指向card类的对象的指针,将card类放在一个容器中方便操作:即在oneHand类中包含成员:vector<card*> myCards;
同样,可以在oneGame 类中也对player定义为vector 类型的:vector<player> onePlayer;
vector在C++中的用法有很多优秀的博客中都有详细的介绍,我自己对于vector的掌握还是基于在java中的过渡,原先在java中使用vector时的具体例子如下:
主要是在学java集合框架的时候,在集合框架中常见的实现类里面,有List接口和Map接口,而在List接口中,实现类有ArrayList 和 Vector,当时老师主要讲了ArrayList的用法,儿对于Vector知识做了简单的概述,所以我现在使用vector可能有很多不正确的用法(希望指正~~~);但是闫老师教我们要善于使用API来查看各个类的构造方法和其中的使用方法:
其中,我打开API之后查到的vector的介绍如下:
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
Vector
类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector
的大小可以根据需要增大或缩小,以适应创建 Vector
后进行添加或移除项的操作。
每个向量会试图通过维护 capacity
和 capacityIncrement
来优化存储管理。capacity
始终至少应与向量的大小相等;这个值通常比后者大些,因为随着将组件添加到向量中,其存储将按 capacityIncrement
的大小增加存储块。应用程序可以在插入大量组件前增加向量的容量;这样就减少了增加的重分配的量。
由 Vector 的 iterator 和 listIterator 方法所返回的迭代器是快速失败的:如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的 remove 或 add 方法之外的任何其他方式),则迭代器将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就完全失败,而不是冒着在将来不确定的时间任意发生不确定行为的风险。Vector 的 elements 方法返回的 Enumeration 不是 快速失败的。
注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException
。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测 bug。
从 Java 2 平台 v1.2 开始,此类改进为可以实现 List
接口,使它成为 Java Collections Framework 的成员。与新 collection 实现不同,Vector
是同步的。
- 从以下版本开始:
- JDK1.0
- 另请参见:
Collection
,List
,ArrayList
,LinkedList
, 序列化表格-
构造方法摘要 Vector()
构造一个空向量,使其内部数据数组的大小为10
,其标准容量增量为零。Vector(Collection<? extends E> c)
构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。Vector(int initialCapacity)
使用指定的初始容量和等于零的容量增量构造一个空向量。Vector(int initialCapacity, int capacityIncrement)
使用指定的初始容量和容量增量构造一个空的向量。 -
方法摘要 boolean
add(E e)
将指定元素添加到此向量的末尾。void
add(int index, E element)
在此向量的指定位置插入指定的元素。boolean
addAll(Collection<? extends E> c)
将指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的顺序添加这些元素。boolean
addAll(int index, Collection<? extends E> c)
在指定位置将指定 Collection 中的所有元素插入到此向量中。void
addElement(E obj)
将指定的组件添加到此向量的末尾,将其大小增加 1。int
capacity()
返回此向量的当前容量。void
clear()
从此向量中移除所有元素。Object
clone()
返回向量的一个副本。boolean
contains(Object o)
如果此向量包含指定的元素,则返回true
。boolean
containsAll(Collection<?> c)
如果此向量包含指定 Collection 中的所有元素,则返回 true。void
copyInto(Object[] anArray)
将此向量的组件复制到指定的数组中。E
elementAt(int index)
返回指定索引处的组件。Enumeration<E>
elements()
返回此向量的组件的枚举。void
ensureCapacity(int minCapacity)
增加此向量的容量(如有必要),以确保其至少能够保存最小容量参数指定的组件数。boolean
equals(Object o)
比较指定对象与此向量的相等性。E
firstElement()
返回此向量的第一个组件(位于索引0
) 处的项)。E
get(int index)
返回向量中指定位置的元素。int
hashCode()
返回此向量的哈希码值。int
indexOf(Object o)
返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回 -1。int
indexOf(Object o, int index)
返回此向量中第一次出现的指定元素的索引,从index
处正向搜索,如果未找到该元素,则返回 -1。void
insertElementAt(E obj, int index)
将指定对象作为此向量中的组件插入到指定的index
处。boolean
isEmpty()
测试此向量是否不包含组件。E
lastElement()
返回此向量的最后一个组件。int
lastIndexOf(Object o)
返回此向量中最后一次出现的指定元素的索引;如果此向量不包含该元素,则返回 -1。int
lastIndexOf(Object o, int index)
返回此向量中最后一次出现的指定元素的索引,从index
处逆向搜索,如果未找到该元素,则返回 -1。E
remove(int index)
移除此向量中指定位置的元素。boolean
remove(Object o)
移除此向量中指定元素的第一个匹配项,如果向量不包含该元素,则元素保持不变。boolean
removeAll(Collection<?> c)
从此向量中移除包含在指定 Collection 中的所有元素。void
removeAllElements()
从此向量中移除全部组件,并将其大小设置为零。boolean
removeElement(Object obj)
从此向量中移除变量的第一个(索引最小的)匹配项。void
removeElementAt(int index)
删除指定索引处的组件。protected void
removeRange(int fromIndex, int toIndex)
从此 List 中移除其索引位于 fromIndex(包括)与 toIndex(不包括)之间的所有元素。boolean
retainAll(Collection<?> c)
在此向量中仅保留包含在指定 Collection 中的元素。E
set(int index, E element)
用指定的元素替换此向量中指定位置处的元素。void
setElementAt(E obj, int index)
将此向量指定index
处的组件设置为指定的对象。void
setSize(int newSize)
设置此向量的大小。int
size()
返回此向量中的组件数。List<E>
subList(int fromIndex, int toIndex)
返回此 List 的部分视图,元素范围为从 fromIndex(包括)到 toIndex(不包括)。Object[]
toArray()
返回一个数组,包含此向量中以恰当顺序存放的所有元素。<T> T[]
toArray(T[] a)
返回一个数组,包含此向量中以恰当顺序存放的所有元素;返回数组的运行时类型为指定数组的类型。String
toString()
返回此向量的字符串表示形式,其中包含每个元素的 String 表示形式。void
trimToSize()
对此向量的容量进行微调,使其等于向量的当前大小。从类 java.util.AbstractList 继承的方法 iterator, listIterator, listIterator
从类 java.lang.Object 继承的方法 finalize, getClass, notify, notifyAll, wait, wait, wait
从接口 java.util.List 继承的方法 iterator, listIterator, listIterator
- 而在C++中,我们习惯于用数组来处理一系列的数值,在处理一些比较复杂的值时,就像这个游戏中要很好的利用C++的封装性的话,就要建立在类的基础上,虽然BlackJack游戏可以很简单的利用函数来实现,可以不用类来写,我的一位队友直接在主函数中一长串的跑了下来,虽然程序可以运行,但是个人觉得应该可以好好地利用C++的三大特点:
inheritance, polymorphism , encapsulation这三个特性的原则来利用类的继承与封装性写~~~~
所以,在C++中,标准模板库STL提供了一组容器、算法、迭代器等其他的许多功能;
迭代器是用来标识容器中的元素的对象,可以利用迭代器来处理各个元素。下面我先举一个使用vector的例子:
首先在头文件中要包含<vector>
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<string> myterm; // 声明一个名为myterm的空白变量,包含string 对象元素,空白变量可以方便在添加新元素时扩大
myterm.push_back("Kai She"); //push_back()成员函数向容器的最后添加一个新的元素
myterm.push_back("Cai Baobao");
myterm.push_back("This is me"); cout << " You have :" << myterm.size() <<" terms\n"; cout <<" Your terms are:\n";
for (int i = ; i < myterm.size(); ++i)
cout << "\t " << myterm[i]<< endl;
cout << " Because you are not excellent enough , you were pop" << endl;
myterm.pop_back();//删除最后一个元素并且将myterm的长度减少1. cout << " Your terms now are:\n";
for (int i = ; i < myterm.size(); ++i)
cout << myterm[i] << endl;
}可以看一下其运行结果:
,
vector在C++中的基本用法的更多相关文章
- STL中mem_fun, mem_fun_ref用法
1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- SQL中distinct的用法
SQL中distinct的用法 1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- jQuery中Animate进阶用法(一)
jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...
- [转载]js中return的用法
一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return; 在大多数情况下,为事件处理函 ...
- js中this的用法
经过近几周的模拟面试题,我查询了一些资料,今天就来说说,在js中this的用法吧.方法有四:第一,用作全局变量,第二,用作表该对象,第三,用作构造函数,第四,用作call和applay
- jQuery中eq()方法用法实例
本文实例讲述了jQuery中eq()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够获取匹配元素集上的相应位置索引的元素. 匹配元素集上元素的位置索引是从0开始的. 语法结构: 复制代码 代 ...
随机推荐
- HDOJ 4497 GCD and LCM
组合数学 GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- Unix时间戳转换怎样在Excel批量修改?
最近在操作项目的时候碰到一个Unix时间戳转换的问题."date_time":1393031347这个是什么,你知道吗?如果你对Unix时间戳了解的话一眼就看出来.但我们本着科普的 ...
- SQL Server 跨数据库查询
语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELECT * F ...
- iOS开发——项目篇—高仿百思不得姐
01 一.包装为导航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewControll ...
- WC总结
去了人生中第一次全国WC,在四川绵阳南山中学举行,去了这么一次,感受颇多,不忍心白白地让时间流逝,于是写篇随笔记录一下. 全程,共计8天. [第1天] 签到,拿餐票,看了看讲义,觉得要狗带. 开营仪式 ...
- GCD-Grand Central Dispatch
经常要用的,总结分类一下. //获得队列 DISPATCH_QUEUE_PRIORTY 优先级 dispatch_queue_t Queue = dispatch_get_global_queue(D ...
- Javaweb Servlet出现Class xxx is not a servlet错误原因
- 开源中国git使用方法
1.添加公匙. 打开开源中国git公匙管理 用TortoiseGit Puttygen生成公匙文件 生成过程中 不断移动点击鼠标(因为生成密匙过程是记录鼠标变化作为加密过程) ...
- 使用Axis2编写webservice客户端,服务端
1.编写客户端 Axis2开发WebService客户端 的3种方式 [参考帖子] http://blog.csdn.net/wangjinwei6912/article/details/851259 ...
- ios swift 2 新的OptionSetType使用方法
http://www.rockhoppertech.com/blog/swift-2-optionsettype/?utm_source=tuicool 主要使用方法如下 components([NS ...