现在有一个函数 void func(int * array,int size);
假如使用数组的后半部分,调用该函数可以这样写,func(array +size/2 +1, size-size/2 -1)
如果使用vector作为 void func(vector<int> vec),也要调用vector的后半部分,该如何写呢?
vector好像不可以直接加上一个长度,表示移动多少位置吧
现在有一个函数 void func(int * array,int size);
假如使用数组的后半部分,调用该函数可以这样写,func(array +size/2 +1, size-size/2 -1)
如果使用vector作为 void func(vector<int> vec),也要调用vector的后半部分,该如何写呢?
vector好像不可以直接加上一个长度,表示移动多少位置吧
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想成指针就可以了。
10 回答11.2k 阅读
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
你可以写:vec.begin() + i; 或者vec[i]
另外,用vector时,传递“引用”更好些。
void func(vector<int>& vec);