走同样的路,发现不同的人生
你可以寫:vec.begin() + i; 或vec[i]另外,用vector時,傳遞「引用」比較好。 void func(vector& vec);
STL使用iterator來抽象化。你這樣的情況,不管func是不是只讀的,你都可以參考std::sort的寫法。
總的來說就是這樣,把
void func(int* array, int size);
改成
template<TIterator> void func(TIterator begin, TIterator end);
舉個簡單的例子,二分查找法:
template<typename TIterator> // 需要random iterator,如果使用了C++ concept的话可以有效美化错误信息 bool find(TIterator begin, TIterator end, std::remove_reference_t<decltype(**(TIterator*)nullptr)> value) { auto size = end - begin; if (size <= 0) return false; auto position = begin + (size / 2); auto middle = *position; if (middle > value) return findx(begin, position, value); if (middle < value) return findx(position+1, end, value); return true; } vector<int> x = {1, 2, 3, 4, 5}; find(x.begin(), x.end(), 2); // true find(x.begin() + 2, x.begin() + 3, 2); // false
由此可見,iterator是發明來模擬指標這個概念的。不過指針的運算要求內容的儲存是連續的,而iterator並不要求。所以為了思考方便,只要把iterator想成指針就可以了。
你可以寫:vec.begin() + i; 或vec[i]& vec);
另外,用vector時,傳遞「引用」比較好。
void func(vector
STL使用iterator來抽象化。你這樣的情況,不管func是不是只讀的,你都可以參考std::sort的寫法。
總的來說就是這樣,把
改成
舉個簡單的例子,二分查找法:
由此可見,iterator是發明來模擬指標這個概念的。不過指針的運算要求內容的儲存是連續的,而iterator並不要求。所以為了思考方便,只要把iterator想成指針就可以了。