2017年3月18日 星期六

iterator 功用與為什麼要使用 它的必要性在哪裡

iterator 功用與為什麼要使用

tags: C++ Concept
iterator指的是對結構的元件做存取,一般他看起來就像是指標一樣的功能,可實際上只是人對程式的操作行為看起來一樣而已,實際上程式對資料的操作行為是不一樣的。
還有一大誤區就是當使用vector操作時給的反饋是一樣的,儘管他們內部的資料操作行為不一樣。
記住vector是保證記憶體連續的,只要記憶體是連續的就可以直接使用資料指標操作取得正確結果
在這段程式碼裡面你可以得到相同的結果
/*****************************************************************
Name : 
Date : 2017/03/18
By   : CharlotteHonG
Final: 2017/03/18
*****************************************************************/
#include <iostream>
#include <vector>
#include <list>
using namespace std;

int main(int argc, char const *argv[]){
    vector<int> a{3, 2, 1};

    vector<int>::iterator it = a.begin();
    for(int i = 0; i < 3; ++i) {
        cout << *(it++) << ", ";
    } cout << endl;

    int* p = &(*a.begin());
    for(int i = 0; i < 3; ++i) {
        cout << *(p++) << ", ";
    } cout << endl;

    return 0;
}
/*==============================================================*/
但這並不代表他們是一樣的操作,在list的結構內並不保證資料的連續性,此時你並不能透過
由第一個頭地址++,推算第二筆資料位置
你根本不知道他們在記憶體的那些地方,透過 iterator 可以幫你獲取正確的位址
/*****************************************************************
Name : 
Date : 2017/03/18
By   : CharlotteHonG
Final: 2017/03/18
*****************************************************************/
#include <iostream>
#include <vector>
#include <list>
using namespace std;

int main(int argc, char const *argv[]){
    list<int> a{3, 2, 1};

    list<int>::iterator it = a.begin();
    for(int i = 0; i < 3; ++i) {
        cout << *(it++) << ", ";
    } cout << endl;

    int* p = &(*a.begin());
    for(int i = 0; i < 3; ++i) {
        cout << *(p++) << ", ";
    } cout << endl;

    return 0;
}
/*==============================================================*/

沒有留言:

張貼留言