實戰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容器提供的迭代器除了這些運算,還支援自減、關係和算數運算。因此,迭代器可根據所提供的操作集進行分類。類似地,還可根據
關於STL中map的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)。 什麼是相應型別? 迭代器所指之物的型別