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

來源:互聯網
上載者:User

標籤:art   .text   split   錯誤   問題   返回   var   cpp   har   

stl的迭代器非常方便 用於各種演算法。

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

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

#include <vector>typedef std::vector<char *> MYARRAY;// This does the trickinline const int iterator_to_index(MYARRAY &a, MYARRAY::iterator it){    return it - a.begin();}// Example usemain(){    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 的元素從第八個元素開始插入。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.