程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 實戰c++中的vector系列--將迭代器轉換為索引

實戰c++中的vector系列--將迭代器轉換為索引

編輯:C++入門知識

實戰c++中的vector系列--將迭代器轉換為索引


stl的迭代器很方便 用於各種算法。

但是一想到vector,我們總是把他當做數組,總喜歡使用下標索引,而不是迭代器。

這裡有個問題就是如何把迭代器轉換為索引:

#include 

typedef std::vector MYARRAY;

// This does the trick
inline const int iterator_to_index(MYARRAY &a, MYARRAY::iterator it)
{
    return it - a.begin();
}

// Example use
main()
{
    MYARRAY     a;
    int     index;

    a.push_back("one");
    a.push_back("two");
    a.push_back("three");

    for (MYARRAY::iterator it = a.begin(); it != a.end(); it++)
    {
        index = iterator_to_index(a, it);
        printf("index=%d\n", index);
    }
}

一、數組習慣用法

對於內置數組我們可以顯式地把數組的元素初始化為一組常量值,例如 :
int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };

我們不能用同樣的方法顯式地初始化 vector ,但是可以將 vector 初始化為一個已有數組的全部或一部分,只需指定希望被用來初始化 vector 的數組的開始地址以及數組最末元的下一位置來實現,例如:
// 把 ia 的 6 個元素拷貝到 ivec 中
vector< int > ivec( ia, ia+6 );

被傳遞給ivec 的兩個指針標記了用來初始化對象的值的范圍, 第二個指針總是指向要拷貝的末元素的下一位置 ,標記出來的元素范圍也可以是數組的一個子集,例如 :

// 拷貝 3 個元素 ia[2], ia[3], ia[4]
vector< int > ivec( &ia[ 2 ], &ia[ 5 ] );

與內置數組不同 vector 可以被另一個 vector 初始化 或被賦給另一個 vector

注意 下面的定義

vector< int > ivec; 
ivec[ 0 ] = 1024; //錯誤

就是錯誤的 ,因為 ivec 還沒有第一個元素 ,我們只能索引 vector 中已經存在的元素 size()操作返回 vector 包含的元素的個數 。

下面的錯誤並不少見:

const int size = 7; 
int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 }; 
vector< int > ivec( size ); 

for ( int ix = 0; ix < size; ++ix ) 
      ivec.push_back( ia[ ix ]); 

程序結束時ivec 包含 14 個元素, ia 的元素從第八個元素開始插入。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved