huyutian

他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  20 随笔 :: 47 文章 :: 22 评论 :: 0 Trackbacks
/*
    Vector: 它就是数组的一个泛化推广, 等同于数组,它拥有一段连续的内存空间,并且起始地址不变,
优点:1)很好的支持随机存取,即[]操作符,查询操作高效
缺点:1)插入/删除会造成内存块的拷贝,效率较低,(尾部元素除外)
    2)内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝,大大影响了vector的效率
*/

#include 
<iostream>
#include 
<vector>
#include 
<algorithm>

using namespace std;

void printVector(vector<int> v1)
{
//使用下标方式
//for (unsigned int i = 0; i < v1.size(); i++)
//{
// cout<<"v1["<<i<<"] = "<<v1[i]<<endl;
//}

//使用迭代器
//vector<int>::iterator iter;
//for (iter = v1.begin(); iter != v1.end(); iter++)
//{
// //cout<<"v1["<<iter-v1.begin()<<"] = "<<*iter<<endl;
// cout<<"v1["<<iter-v1.begin()<<"]"<<"="<<*iter<<", ";
//}
//cout<<endl;

//使用迭代器指针
//vector<int>::iterator *pIter; //Error,迭代器指针需要分配内存才能使用,
             
//或者通俗的说pIter未实现时,*pIter是不确定的,运行时对其赋值必须会发生异常
vector<int>::iterator *pIter = new vector<int>::iterator; 
if(NULL == pIter)
{
   
return;
}

for(*pIter = v1.begin(); *pIter != v1.end(); (*pIter)++//此处若写成*pIter++是不对的,因为++优化级别较高
{
   cout
<<**pIter<<"";
}

if (NULL != pIter)
{
   delete pIter;
   pIter 
= NULL;
}

cout
<<endl;
}


void reversePrintVector(vector<int> vec)
{
vector
<int>::reverse_iterator revIter;
for (revIter = vec.rbegin(); revIter != vec.rend(); revIter++)
{
   cout
<<"v["<<revIter-vec.rbegin()<<"]="<<*revIter<<"";
}

cout
<<endl;
}

int main()
{
//创建
vector<int> v1; //创建空的vector对象
vector<int> v2(10); //创建具有10个元素的vector对象
vector<double> v3(109.1); //创建具有10个元素的vector对象,每个元素的值为9.1
vector<double> v4(v3); //通过拷贝一个V3对象的各个元素值,创建一个新的vector对象
int iArray[] = {1113 , 192327};
vector
<int> v(iArray, iArray + 5);//通过拷贝迭代器区间[first, end)的元素值,创建新的vector对象

//初始化----用push_back,在容器的尾端插入新元素
v1.push_back(3);
v1.push_back(
10);
v1.push_back(
19);

//遍历访问:1-下标方式(略)
//遍历访问之2:迭代器方式, 建议使用此方式并熟练应用之
cout<<"printVector(v1): "<<endl; 
printVector(v1);

//反向遍历之迭代器方式
cout<<"reversePrintVector(v1):"<<endl;
reversePrintVector(v1);

//插入元素:用insert(&pos, elem)
cout<<"v1.insert(v1.begin() + 1, 100): "<<endl;
v1.insert(v1.begin() 
+ 1100);
printVector(v1);

//删除元素: 尾部元素删除用pop_back();单个元素删除用erase(&pos);
//[first, last)区间元素删除用erase(&first, &last); 整体删除用clear();
cout<<"v1.erase(v1.begin() + 1): "<<endl;
v1.erase(v1.begin() 
+ 1);
printVector(v1);
cout
<<"v1.pop_back():"<<endl;
v1.pop_back();
printVector(v1);

//查找函数:由外部算法提供
vector<int>::iterator iter;
cout
<<"find(v1.begin(), v1.end(), 2) = "<<endl;
iter 
= find(v1.begin(), v1.end(), 10);
if (iter != v1.end())
   cout
<<"find "<<*iter<<" at index: "<<iter-v1.begin()<<endl;
else
   cout
<<"not find"<<endl; 

cout
<<"v1.empty() = "<<v1.empty()<<endl;
cout
<<"其它:\nv1.empty() = "<<v1.empty()<<", v1.size() = "<<v1.size()<<", v1.max_size() =(hex)"<<hex<<v1.max_size()<<endl;
cout
<<"head-elem="<<dec<<v1.front()<<endl;
cout
<<"tail-elem="<<v1.back()<<endl;

//清空
cout<<"v1.clear() "<<endl;
v1.clear();
cout
<<"v1.size() = "<<v1.size()<<", v1.empty()="<<v1.empty()<<endl;
}



////////////////////////////////////运行结果////////////////////////////////////////////////////////
printVector(v1):
31019,
reversePrintVector(v1):
v[
0]=19, v[1]=10, v[2]=3,
v1.insert(v1.begin() 
+ 1100):
31001019,
v1.erase(v1.begin() 
+ 1):
31019,
v1.pop_back():
310,
find(v1.begin(), v1.end(), 
2=
find 
10 at index: 1
v1.empty() 
= 0
其它:
v1.empty() 
= 0, v1.size() = 2, v1.max_size() =(hex)3fffffff
head
-elem=3
tail
-elem=10
v1.clear()
v1.size() 
= 0, v1.empty()=1
posted on 2010-02-08 00:00 胡雨田 阅读(1991) 评论(0)  编辑 收藏 引用 所属分类: 编程技巧

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理