1. 程式人生 > >實戰c++中的vector系列--將迭代器轉換為索引

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

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

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

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

#include <vector>

typedef std::vector<char *> 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 的元素從第八個元素開始插入。

相關推薦

實戰c++vector系列--轉換索引

stl的迭代器很方便 用於各種演算法。 但是一想到vector,我們總是把他當做陣列,總喜歡使用下標索引,而不是迭代器。 這裡有個問題就是如何把迭代器轉換為索引: #include <vector> typedef std::vector

C#foreach語句的實現機制

C#中的foreach語句可用於迴圈遍歷某個集合中的元素,而所有的只要支援了IEnumerable或IEnumerable<T>泛型介面的型別都是可以 用foreach遍歷的。其具體的遍歷實現過程就是利用C#中的迭代器中的方法來按照特定順序遍歷的。在.NET中I

從 s = "我愛北京天安門" 悟道了-----------操作print(c.__next__())的最!大!好!處!-----------------------------------------------------可以一個一個輸出

s = "我愛北京天安⻔"c = s.__iter__() # 獲取迭代器# print(c) # 列印迭代器的地址# print(c.__next__()) # 列印迭代器中的下一個# print(c.__next__())# print(c.__next__

設計模式系列模式(Iterator Pattern)——遍歷聚合物件的元素

模式概述 模式定義 模式結構圖 模式虛擬碼 模式改進 模式應用 模式在JDK中的應用 模式在開源專案中的應用 模式總結 說明:設計模式系列文章是讀劉偉所著《設計模式的藝術之道(軟體開發人員內功修煉之道)》一書的閱讀筆記。個人感覺這本書講的不錯,有興趣推薦讀一讀。詳細內容也可以看看此書作者的部

vector容器、和空間配置三個類方法的實現

C++的STL庫有一個容器叫vector,這個容器底層的資料結構是一個記憶體可以自動增長的陣列,每次當陣列儲存滿了以後,記憶體可以自動增加兩倍,請完成vector容器、迭代器和空間配置器三個類方法的實現。 #include<iostream> using namespace std; //容器預

vector容器,,空間介面卡三個類方法的實現

C++的STL庫有一個容器叫vector,這個容器底層的資料結構是一個記憶體可以自動增長的陣列,每次當陣列儲存滿了以後,記憶體可以自動增加兩倍,請完成vector容器、迭代器和空間配置器三個類方法的實現。 #include<iostream> using namespace

Apex 的自定義

迭代器 迭代器(iterator)可以遍歷一個集合變數中的每個元素。Apex提供了Iterator介面來讓開發者實現自定義的迭代器。 Iterator介面 Iterator介面定義了兩個函式: hasNext():返回Boolean型別,表示被遍歷的集合變數中是否還有下一個元素 next()

python的生成器、,可物件

最近學習了python中的生成器、迭代器、可迭代物件的知識,現在回顧一下,鞏固理解 先說一下列表生成式: 執行結果如下: 通過方括號加入裡面的表示式,從而生成一個列表,在這裡注意一下,列表生成時也可以加入函式: 結果如下:   計算了X的三次方

c++ 模版程式設計,構造和雙向連結串列

#pragma once #include <iostream> #include <stdexcept> #include "func.h" // 連結串列 template <typename T>class li

C# 傳統遍歷與

引言:   在C# 1.0中我們經常使用foreach來遍歷一個集合中的元素,然而一個型別要能夠使用foreach關鍵字來對其進行遍歷必須實現IEnumerable或IEnumerable介面,(之所以來必須要實現IEnumerable這個介面,是因為fore

C++標準模板庫(STL)的原理與實現

引言 迭代器(iterator)是一種抽象的設計理念,通過迭代器可以在不瞭解容器內部原理的情況下遍歷容器。除此之外,STL中迭代器一個最重要的作用就是作為容器(vector,list等)與STL演算法的粘結劑,只要容器提供迭代器的介面,同一套演算法程式碼可以利

java-Collection集合、List集合、Vector集合和Iterator、ListIterator的使用

1、物件陣列的概述和使用  * A:案例演示     * 需求:我有5個學生,請把這個5個學生的資訊儲存到陣列中,並遍歷陣列,獲取得到每一個學生資訊。    *     Student[] arr = new Student[5]; //儲存學生物件     arr[0] = new Student("張三

C++五種型別的

     迭代器定義了常用的操作集,但有些迭代器具有比其他迭代器更強大的功能。例如ostream_iterator只支援自曾、解引用和複製運算,而vector容器提供的迭代器除了這些運算,還支援自減、關係和算數運算。因此,迭代器可根據所提供的操作集進行分類。類似地,還可根據

關於STLmap的erase是否失效的討論

近來,在閱讀一份開原始碼的時候,看到了類似如下的程式碼:typedef std::map<int, std::string> id_names_t; id_names_t id_name

小心刪除容器元素時的失效

從一個簡單的問題開始,刪除陣列中某個元素後連續重複的元素,例如 1,1,2,3,3,1,1,1,4,0 ---> 1, 2,3,1,4,0。 考慮了幾秒,然後就開始動手寫程式碼了: #include <iostream>#include <vec

c++學習-為什麼要用

本文記錄我對迭代器的一點理解。先列出參考的文章[LevelDB原始碼分析–使用Iterator簡化程式碼設計]。我對參考文章的內容自己做了實現,我講的不清楚的地方可以直接參考原文。 為什麼要設計迭代器這個東西 用迭代器可以很大程度上隔離容器底層實現

關於STL的list,vector等用iterator,用erase刪除元素出現的問題。

做個測試,隨便搞個類,標頭檔案加入 #include <vector>#include <list>using namespace std; typedef std::vector<CString> CStringVector; 然後在

標準庫vector型別和iterator型別

對C++ Primer 中文版第4版  第三章標準庫型別中的vector型別和迭代器iterator型別做一個總結。 vector稱為容器,是同一種類型的物件的集合。一個容器中的所有物件都必須是同一種類型。 1.使用vector之前,必須包含相應的標頭檔案。宣告如下:  

visual studio使用printf列印內容時與cout的差別

迭代器是c++中用於遍歷容器中的元素的資料型別,但是今天在使用vs2015進行除錯的時候,發現對於c++的容器的實現,vs 2015與vc++ 6.0有很大的差異,應該是使用vs進行編譯時的一個漏洞吧。 問題起源 關於下面的程式碼,在vs 2015

C++ Traits程式設計技法--從的設計看引數推導與型別推導

迭代器與相應型別推導 在寫作泛型函式或程式碼時,我們可能存在這樣的需要:與引數相關的其它型別,比如一個迭代器的值的型別,在演算法中運用迭代器時,很可能會用到其也叫相應型別(associate type)。 什麼是相應型別? 迭代器所指之物的型別