如何將vector int iterator轉換成int ?

時間 2021-12-29 00:29:00

1樓:cqwrteur

C++20有std::to_address

同時還可以用 if constexpr(std::contiguous_iterator) 判斷

建議呼叫演算法全部用指標

2樓:從前有座山

stl可以理解為對一套介面的定義,是一套標準,stl原始碼剖析,只是使用了其中一種比較容易閱讀的實現來進行講解,「vector::iterator變數的型別其實就是int*」是不準確的,只能說原生指標是一種滿足vector迭代器的實現,但實際還有其他一些不是直接使用原生指標的實現,你要是使用windows開發環境,可以go到定義裡去看,windows的vector的迭代器,是乙個類來實現的,增加了一些debug下異常判斷之類的東西。。

3樓:飛翔的荷蘭豬

vector::iterator的型別並不是int*,而是乙個class,裡面封裝了乙個int*。iterator是乙個class,而不是指標,std::

is_pointer_v的結果應該是false.

static_cast 與reinterpret_cast 是不能把class轉換成指標的。可以取iter的指標,轉換成int**, 再取址到得int*。

class

iterator

;iterator

iter

;autop=

static_cast

(iter

);// error

autop=

reinterpret_cast

(iter

);// error

autopp=

reinterpret_cast

(&

iter

);autop=

&pp;// ok,但不建議

std::

vector

a;

autop=

a.data

();//推薦

但並不建議這樣做。標準庫並未規定vector的iterator底層必須是乙個指標,只是各大編譯器都是用指標來實現了而已,我完全可以將iterator底層改成size_t pos加陣列首位址的形式,提供同樣的介面,實現一樣的功能。此時以上reinterpret_cast做法將完全失效。

使用reinterpret_cast是對語言本身的hack行為,用來脫離語言限制的手法,比如脫離控制符protect,private的限制。

class

Aprivate

:inta=

1;intb=1

;};// HackA具有與A相同的記憶體布局

class

HackA;A

a;a.

get();

// 1a.

a=0;

//errora.

b=0;

//error

auto

pHackA

=reinterpret_cast

*>(&

a);pHackA

->a=

0;//ok

pHackA

->b=

0;//oka.

get();

// 0

//當類A設計者改變A的設計如下

class

Aprivate

:intv=

1;};// hack 手法失效

pHackA

->a=

0;//error

pHackA

->b=

0;//error

static_cast的用法:

1.用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。

進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。

2用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

3把空指標轉換成目標型別的空指標。

4把任何型別的表示式轉換成void型別。

reinterpret_cast的用途:

指標、引用、算術型別、函式指標或者成員指標之間的轉換。

4樓:Drowned

根據https://

,iterator不一定是指標,事實上在MSVC裡面確實也不是,別的平台是不是我沒注意。

一般來說除了尾迭代器以外都可以解引用再取位址(和別的回答一樣)。但是尾迭代器(不是尾元素的迭代器,是end(),cend(),rend()這種)直接解引用會執行出錯的,可以先取尾元素的位址再向後偏移。

不過一般還是不建議把迭代器換成指標,印象中標準庫好像沒有必須要用int指標的場景。

如何將人看透?

PS 我認為快速看透真的是一項很難很難的技巧,快速的話,最多就有個大致的了解已經不錯了 要快速得對乙個人有大致的了解的話,個人經驗有幾點 1 在經常接觸過很多態別的人的情況下,相信你的直覺,特別是第一印象。第一印象是基石,後面的接觸都是不斷修正的過程,但是第一印象有70 80 是很接近的。但第一印象...

如何將音準練好?

目目老師 還是挺大的進步了 不要只聽不唱,聽了要跟著唱你才能真正把音調記住,記準那你音域太窄了,大部分流行歌最少都要八度,題主的低音到哪兒?這個不清楚 這個要去找專業人士鑑定,我說了不算 先找自己的中音在哪個區域,把中音練好,再談擴充套件音域,優化聲音,再學換聲唱高音 車機CarPlay安裝 如何將...

如何將知識實踐?

超人迪加 我也有同感,主要是因為你個人比較好學,了解的東西多,知識學多了,最後導致很多時候不知道用到哪,然後越學越沒心思。對於這點,我有如下建議 1.你要知道你自己的知識是哪一類知識 是物理學的知識,是語言學的知識,還是數學知識 2.然後再細化,例如你的知識是數學知識,那是幾何知識,還是概率學知識,...