`
huanggaole
  • 浏览: 10059 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA转型C++(一):标准模板库

 
阅读更多
1.标准模板库
    模板是C++程序设计语言的一个比较新的重要特征,而标准模板库正是基于此特征。标准模板库使得C++编程语言在有了同Java一样强大的类库的同时,保有了更大的可扩展性。事实上,C++的模版,本身即是一套复杂的宏语言(macro language),宏语言最大的特色为:所有工作在编译时期就已完成。
    这里以vector(向量)为例。C++提供了内建阵列的替代型态vector,vector 可以如同阵列一样的存取方式,例如使用下标(Subscript)运算子,并记得自己的长度资讯(size),您也可以使用物件的方式来存取vector(push、pop)。使用vector可以轻易地定义二维可调整型阵列。要使用vector,必须含入vector表头档。
    (1) 声明向量前,必须引入其头文件
#include <vector>
using namespace std;

    (2) 向量的声明方法:vector<向量里存储的元素类型> 向量名
vector<string> inventory;
vector<string> inventory(10); //初始大小为10的向量
vector<string> inventory(10,"nothing"); //初始大小为10,10个元素全都初始化为"nothing"
vector<string> inventory(myStuff); //创建一个新向量,其内容与myStuff相同

    (3)向量中元素的插入:向量名.push_back(要插入的元素);
    push_back()成员函数在向量的最后添加一个新的元素。
    (4)返回向量中元素的个数:向量名.size();
    (5)向量的索引:向量名[索引下标];(如数组一样)
    (6)移除最后的成员:向量名.pop_back();
    pop_back()成员函数移除向量的最后一个元素并将其大小减1
    (7)移除向量所有元素:向量名.clear();
    (8)检查向量是否为空:向量名.empty();若为空返回true否则返回false。
    (9)插入向量:向量名.insert();添加至序列的任意位置。例如:
inventory.insert(inventory.begin(),"oldstring"); //inventory.begein()以下有介绍

    以上语句是将"oldstring"插入在序列开头,原有的插入点之后的元素全部后移一个位置。返回值是新插入的元素的迭代器。实际上函数的第一个参数是迭代器类型。关于迭代器下面有介绍。
    (10)移除任意成员:向量名.erase();可以移除位于中间的成员。例如:
    迭代器:迭代器是将容器的潜力发挥到极致的关键。迭代器可以用于循环访问序列容器。迭代器的具体用法如下:
inventory.erase((inventory.begin() + 2));

    以上语句移除了向量中的第三个元素。随后的元素都上移一位,返回值是移除的元素之后的那个元素。
    (1)声明迭代器
    有两种迭代器,声明方法如下(以string容器为例):
vector<string>::iterator myIterator;  //常规迭代器
vector<string>::const_iterator iter;  //常量迭代器

    迭代器是标识容器中某个特定元素的值。常规迭代器可以修改其值,而常量迭代器只能读出特定元素的值,不能修改。
    (2)循环访问向量
    向量有两个成员变量函数:begin()和end(),前者返回容器中的第一个元素的地址;后者返回容器中的最后一个元素之后的一个地址。实际上,迭代器中存储的就是向量中元素的地址,通过对迭代器进行自加,就能够得到下一个元素的地址。因此可以通过以下代码实现循环访问向量:
for (iter = inventory.begin(); iter != inventory.end(); ++iter)
{
......
}

    (3)修改向量元素的值
    由于迭代器可以看成是标记向量元素的地址,那么要取得该向量的值,只需要像解引用地址那样在迭代器名前加一个*。如果是常规迭代器,还可以对向量元素的值进行解引用。例如:
*myIterator = "newstring";
cout << (*myIterator).size();
  
    (4)从向量中查找一个值:find(向量查找范围的下限,向量查找范围的上限,要查找的值);例如:
iter = find(inventory.begin();inventory.end();"newstring");

    (5)对向量进行乱序:rand_shuffle(向量乱序范围的下限,向量乱序范围的上限);例如:
//srand(static_case<unsigned int>(time(0)));//用系统时间做随机数的种子,要自动转型成整型
random_shuffle(inventory.begin();inventory.end());

    (6)对向量进行排序:sort(向量排序范围的下限,向量排序范围的上限);例如:
sort(inventory.begin();inventory.end());


    另外,vector还有两个与动态增长有关的成员函数,capacity()和reserve()。前者返回向量的容量,即在程序必须为其重新分配更多的内存前,向量所能容纳的元素数目。它与向量的大小不是同一概念。向量的大小是指已经用的内存数,向量的容量是指分配了的内存数。如果分配给向量的内存全部用了还不够,就需要reserve()函数将向量的容量扩充额外的容量。例如:
if(inventory.capacity() - inventory.size() < 10)
{
    inventory.reserve(inventory.capacity() + 100);
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics