开发者社区> xumaojun> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

标准模板库(STL)学习指南之vector向量

简介:
+关注继续查看
vector

 

 一.  vector可以模拟动态数组

 

 二.  vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public

 

       拷贝构造函数和重载的赋值操作符)

 

    三.必须包含的头文件#include <vector>

 

        四.  vector支持随机存取

 

        五.  vector的大小(size)和容量(capacity)通常是不同的,size返回实际元素个数,

 

               capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,

 

       需要重新配置内部存储器。 

 

                      

 

->构造、拷贝和析构 

 

 

 

 ->非变动操作

 

 

 eg.

复制代码
复制代码
   vector<int> v1(10);
   cout << "The capacity of v1 is " << v1.capacity() << endl;
   cout << "The size of v1 is " << v1.size() << endl;
   vector<int> v2;
   v2.reserve(20);
   cout << "The capacity of v2 is " << v2.capacity() << endl;
   cout << "The size of v2 is " << v2.size() << endl;
output :
   The capacity of v1 is 10
   The size of v1 is 10
   The capacity of v2 is 20
   The size of v2 is 0
复制代码
复制代码

 

 

 

 

 

->赋值操作

 

 

 

所有的赋值操作都有可能调用元素类型的默认构造函数,拷贝构造函数,赋值操作符和析构函数

 

如: 

 

  std::list<T> l;

 

  std::vector<T> v;

 

  

 

  v.assign(l.begin(),l.end());

eg.    

复制代码
复制代码
   vector<int> v;
   v.assign( 10, 42 );
   for( vector<int>::size_type i = 0; i < v.size(); i++ ) {
     cout << v[i] << " ";
   }
   cout << endl;

OutPut : 

42 42 42 42 42 42 42 42 42 42

 

   vector<int> v1;
   for( int i = 0; i < 10; i++ ) {
     v1.push_back( i );
   }
 
   vector<int> v2;
   v2.assign( v1.begin(), v1.end() );
 
   for( vector<int>::size_type i = 0; i < v2.size(); i++ ) {
     cout << v2[i] << " ";
   
cout << endl

output :

0 1 2 3 4 5 6 7 8 9  

复制代码
复制代码

 

 

元素存取 

 

 

 

 

 下面的操作是错误的:

      std::vector<T> v;//empty

 

 

 
  v[5]= t; //runtime error

 

  std::cout << v.front(); //runtime error

eg. 

复制代码
复制代码
  vector<string> words;
    string str;
 
    while( cin >> str ) words.push_back(str);
 
    sort( words.begin(), words.end() );
 
    cout << "In alphabetical order, the first word is '" << words.front() << "'." << endl;
假设输入是:  now is the time for all good men to come to the aid of their country
output:
In alphabetical order, the first word is 'aid'.

   vector<int> v;
   for( int i = 0; i < 5; i++ ) {
     v.push_back(i);
   }
   cout << "The first element is " << v.front()
        << " and the last element is " << v.back() << endl;
output:
The first element is 0 and the last element is 4
复制代码
复制代码
 

 

 

 迭代器相关函数

 

 

 

使用迭代器时应注意:

 

迭代器持续有效,除非发生以下两种情况:

 

 

1.) 或插入元素

 

2.) 容量变化而引起内存重新分配

 eg.

复制代码
复制代码
    vector<string> words;
    string str;
 
    while( cin >> str ) words.push_back(str);
 
    for( vector<string>::const_iterator iter = words.begin();
         iter != words.end(); ++iter ) {
      cout << *iter << endl;
    }

 假设输入是 :  hey mickey you're so fine 

 output:

    hey  
    mickey
    you're
    so
    fine
 

 

复制代码
复制代码

 

 

 

 

 

 插入(insert)元素

 

 eg.

 

复制代码
复制代码
   vector<char> alphaVector;
   for( int i=0; i < 10; i++ ) {
     alphaVector.push_back( i + 'A' );
   }
 
   // Insert four C's into the vector
   vector<char>::iterator theIterator = alphaVector.begin();
   alphaVector.insert( theIterator, 4, 'C' );
 
   // Display the vector
   for( theIterator = alphaVector.begin(); theIterator != alphaVector.end(); ++theIterator )    {
     cout << *theIterator;
   }

 output:

CCCCABCDEFGHIJ 

 

    vector<int> v1;
    v1.push_back( 0 );
    v1.push_back( 1 );
    v1.push_back( 2 );
    v1.push_back( 3 );
 
    vector<int> v2;
    v2.push_back( 5 );
    v2.push_back( 6 );
    v2.push_back( 7 );
    v2.push_back( 8 );
 
    cout << "Before, v2 is: ";
    for( vector<int>::size_type i = 0; i < v2.size(); i++ ) {
      cout << v2[i] << " ";
    }
    cout << endl;
 
    v2.insert( v2.end(), v1.begin(), v1.end() );
 
    cout << "After, v2 is: ";
    for( vector<int>::size_type i = 0; i < v2.size(); i++ ) {
      cout << v2[i] << " ";
    
   cout << endl

output :

    Before, v2 is: 5 6 7 8 
    After, v2 is: 5 6 7 8 0 1 2 3 

 

复制代码
复制代码

 

 

 

删除(remove)元素

 

 

 eg.

复制代码
复制代码
    vector<char> alphas;
    for( int i=0; i < 10; i++ ) {
      static const char letters[] = "ABCDEFGHIJ";
      alphas.push_back( letters[i] );
    }
    vector<char>::size_type size = alphas.size();
    vector<char>::iterator startIterator;
    vector<char>::iterator tempIterator;
    for( vector<char>::size_type i=0; i < size; i++ ) {
      startIterator = alphas.begin();
      alphas.erase( startIterator );
      // Display the vector
      for( tempIterator = alphas.begin(); tempIterator != alphas.end(); ++tempIterator ) {
        cout << *tempIterator;
      }
      cout << endl;
    }

 output:

    BCDEFGHIJ
    CDEFGHIJ
    DEFGHIJ
    EFGHIJ
    FGHIJ
    GHIJ
    HIJ
    IJ 
    J

 

 

    vector<char> alphas;
    for( int i=0; i < 10; i++ ) {
      static const char letters[] = "ABCDEFGHIJ";
      alphas.push_back( letters[i] );
    }
    // display the complete vector
    for( vector<char>::size_type i = 0; i < alphas.size(); i++ ) {
      cout << alphas[i];
    }
    cout << endl;
 
    // use erase to remove all but the first two and last three elements
    // of the vector
    alphas.erase( alphas.begin()+2, alphas.end()-3 );
    // display the modified vector
    for( vector<char>::size_type i = 0; i < alphas.size(); i++ ) {
      cout << alphas[i];
    
    cout << endl;

 output:

    ABCDEFGHIJ 
    ABHIJ 

 

 

#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main()
{
    vector<char> alphas;
    for( int i=0; i < 10; i++ ) {
      static const char letters[] = "ABCDEFGHIJ";
      alphas.push_back( letters[i] );
    }
 
    vector<char>::iterator iter = alphas.begin();
    while( iter != alphas.end() )
    {
      if (*iter == 'B' || *iter == 'D')
        iter = alphas.erase( iter );
      else
        ++iter;
    }
 
    copy(alphas.begin(), alphas.end(), ostream_iterator<char>(cout, ""));
    cout << endl;
  } 

output :

ACEFGHIJ 

 

复制代码
复制代码

 转载自:http://www.cppblog.com/MiYu/archive/2010/08/31/125459.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【C++初阶:STL —— vector】vector的介绍及使用 | 迭代器失效问题 | vector的深度剖析及模拟实现 上
【C++初阶:STL —— vector】vector的介绍及使用 | 迭代器失效问题 | vector的深度剖析及模拟实现
0 0
【C++初阶:STL —— vector】vector的介绍及使用 | 迭代器失效问题 | vector的深度剖析及模拟实现 下
【C++初阶:STL —— vector】vector的介绍及使用 | 迭代器失效问题 | vector的深度剖析及模拟实现
0 0
标准模板库(STL)学习指南之vector向量
vector   – 一.  vector可以模拟动态数组   – 二.  vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public          拷贝构造函数和重载的赋值操作符)       三.必须包含的头文件#include   –        四.  vector支持随机存取   –        五.  vector的大小(size)和容量(capacity)通常是不同的,size返回实际元素个数,                  capacity返回vector能容纳的元素最大数量。
414 0
标准模板库(STL)学习指南之sort排序
对于程序员来说,数据结构是必修的一门课。从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来。幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思去考虑其算法原理,也不用再去验证其准确性。
735 0
STL学习小结 .
from:http://blog.csdn.net/byxdaz/article/details/4633826#comments STL就是Standard Template Library,标准模板库。
1248 0
+关注
xumaojun
乐于学习与分析
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载