84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
走同样的路,发现不同的人生
你可以写:vec.begin() + i; 或者vec[i]另外,用vector时,传递“引用”更好些。void func(vector<int>& 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]
另外,用vector时,传递“引用”更好些。
void func(vector<int>& vec);
STL使用iterator来抽象。你这样的情况,不管func是不是只读的,你都可以参考std::sort的写法。
总的来说就是这样,把
改成
举个简单的例子,二分查找法:
由此可见,iterator是发明来模拟指针这个概念的。不过指针的运算要求内容的存储是连续的,而iterator并不要求。所以为了思考方便,你只要把iterator想成指针就可以了。