簡體   English   中英

為什么迭代器操作符+返回副本?

[英]Why does an iterator operator + return a copy?

如果你有一個迭代器vector<int>::iterator i = vector.begin()i++會將實際的迭代器向下移動。 但為什么會這樣呢

i = i + 3

給你一個新的迭代器三個門?

模仿人們期望的自然行為+ 與以下相同的方式:

int x = 0;
int y = x + 3;

第二行不會更改x ,它只是計算值3.但是, x++ 修改x

如果你想推進通用迭代器,你應該使用std::advance(i, 3) (它將在隨機訪問迭代器上做i += 3而在任何其他迭代迭代器上做i++三次)。

當您使用operator+ ,您不希望修改任何一個操作數。 這意味着必須創建一個新對象。 就像你這樣做:

int a = 5;
int b = a + 3;

你仍然希望a等於5。

這樣你就可以寫:

j = i + 3;

如果operator+沒有創建一個新的副本,那是什么? 修改i

這是因為x + n 應該改變的值x ,不論什么x是,無論是intiterator 這個想法是一樣的。

但是如果你不想寫這個:

it = it + 3;

然后你有另一種選擇,你可以這樣寫:

std::advance(it, 3);

請注意,如果某些標准容器不支持隨機訪問迭代器 1則不能it = it + 3 ,但您仍然可以編寫std::advance(it,3) 例如:

std::list<int>::iterator it = lst.begin();

it  = it + 3; //COMPILATION ERROR. `it` is not random access iterator

std::advance(it,3); //okay

所以在這種情況下, std::advance(it,3)是唯一的方法(或者你自己編寫這樣的功能)

注意std::vector<T>::iterator是隨機訪問迭代器,這就是為什么你可以寫it+3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM