在函数原型中使用向量迭代器
Using vector iterator in function prototype
我想执行以下操作:
vector<int> vec;
auto iter = vec.begin();
现在我想要一个将 iter 作为输入和 returns iter 的函数。
____ func(___ & iter)
这里要填___
,___
应该填什么?
这实际上取决于您需要的迭代器类型。一般来说,它将是 vector<int>::iterator
。
begin()
定义为:
iterator begin() noexcept;
const_iterator begin() const noexcept;
std::vector<int>::begin()
returns 类型 std::vector<int>::iterator
的实例,或者 std::vector<int>::const_iterator
如果被调用者被标记为 const
.
在您的示例中,decltype(iter)
将是 std::vector<int>::iterator
,因此只需像这样声明函数:
std::vector<int>::iterator
func (std::vector<int>::iterator iter);
请注意,STL 迭代器设计为按值传递,因此我去掉了函数签名中的引用。
有点傻的例子,但这里有一些使用模板和 decltype 推导迭代器类型的例子:
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
template <class T> void double_vals(T vbeg, T vend)
{
for (; vbeg != vend; ++vbeg)
*vbeg *= 2;
}
template <class T, class T2> auto find_val(T vbeg, T vend, T2 val) -> decltype(vbeg)
{
for (; vbeg != vend; ++vbeg)
if (*vbeg == val) return vbeg;
return vbeg;
}
int main()
{
vector<int> vec = {10, 20, 30};
auto it1 = vec.begin();
auto it2 = vec.end();
double_vals(it1, it2);
auto it3 = find_val(it1, it2, 20);
if (it3 != vec.end())
cout << "Found value!\n";
for (auto i : vec)
{
cout << i << '\n';
}
return 0;
}
// Note that you could avoid using decltype() here by doing
template <class T, class T2> T find_val(T vbeg, T vend, T2 val)
{
for (; vbeg != vend; ++vbeg)
if (*vbeg == val) return vbeg;
return vbeg;
}
我想执行以下操作:
vector<int> vec;
auto iter = vec.begin();
现在我想要一个将 iter 作为输入和 returns iter 的函数。
____ func(___ & iter)
这里要填___
,___
应该填什么?
这实际上取决于您需要的迭代器类型。一般来说,它将是 vector<int>::iterator
。
begin()
定义为:
iterator begin() noexcept;
const_iterator begin() const noexcept;
std::vector<int>::begin()
returns 类型 std::vector<int>::iterator
的实例,或者 std::vector<int>::const_iterator
如果被调用者被标记为 const
.
在您的示例中,decltype(iter)
将是 std::vector<int>::iterator
,因此只需像这样声明函数:
std::vector<int>::iterator
func (std::vector<int>::iterator iter);
请注意,STL 迭代器设计为按值传递,因此我去掉了函数签名中的引用。
有点傻的例子,但这里有一些使用模板和 decltype 推导迭代器类型的例子:
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
template <class T> void double_vals(T vbeg, T vend)
{
for (; vbeg != vend; ++vbeg)
*vbeg *= 2;
}
template <class T, class T2> auto find_val(T vbeg, T vend, T2 val) -> decltype(vbeg)
{
for (; vbeg != vend; ++vbeg)
if (*vbeg == val) return vbeg;
return vbeg;
}
int main()
{
vector<int> vec = {10, 20, 30};
auto it1 = vec.begin();
auto it2 = vec.end();
double_vals(it1, it2);
auto it3 = find_val(it1, it2, 20);
if (it3 != vec.end())
cout << "Found value!\n";
for (auto i : vec)
{
cout << i << '\n';
}
return 0;
}
// Note that you could avoid using decltype() here by doing
template <class T, class T2> T find_val(T vbeg, T vend, T2 val)
{
for (; vbeg != vend; ++vbeg)
if (*vbeg == val) return vbeg;
return vbeg;
}