通过模板访问std容器的迭代器

姆费吉

我想编写一个函数,该函数需要一个std容器开始和结束,以将容器中的所有值添加到第三个参数。例如,如果我有

std::vector<int> my_ints{ 1, 2, 3 };
int sum_int = accumulate(my_ints.cbegin(), my_ints.cend(), 10); //should return 16.

我想以可以与任何std容器一起使用的方式来概括该功能。如何编写可以访问元素迭代器的模板?

template<typename It, typename T>
T accumulate(It begin, It end, T x)
{
    for (It i = begin; i != end; ++i) 
    {
        x = x + i;
    }
    return x;
}

这就是我目前所拥有的。但是,它不会编译,因为x和i不是同一类型。

泰德·林格莫

正如Peter在评论中提到的那样,您试图将实际的迭代器添加到x它所指向的值而不是它指向的值。您需要取消引用迭代器以获取值:

template<typename It, typename T>
T accumulate(It begin, It end, T x) {
    // there's no need create a new iterator (i) here, use the one you already have (begin):
    for(; begin != end; ++begin)
        x += *begin; // use * to dereference the iterator
    return x;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

非模板容器迭代器

通过取消引用的迭代器访问 std::set

通过直接在C ++中直接访问容器的迭代器来删除容器的元素

检查 std::list 迭代器是否在没有访问容器的情况下结束

如何实现非连续容器(例如std :: deque)的随机访问迭代器?

通过索引访问向量迭代器?

通过迭代器从std :: vector中删除

带有来自模板容器的迭代器的C ++函数

如果容器不是调用函数中的引用,则通过std :: thread将引用传递给迭代器失败

使用随机访问迭代器调用模板函数

检查模板参数是否具有随机访问迭代器

在C ++ std :: map中使用模板迭代器

内置容器的迭代器

关于容器的迭代器

具有std :: unique_ptr的容器的访问器函数

可通过迭代器和索引访问的Python类

如何通过推进std :: map迭代器来停止for循环?

通过引用传递迭代器给std :: inner_product

是否有用于随机访问迭代器的 std 视图,因为 std::span 用于连续迭代器?

迭代器与STL容器的关系

稀疏的容器和迭代器

C ++随机访问迭代器,用于按需加载元素的容器

将 std::ranges 算法与自定义容器和迭代器一起使用

{}是传递给需要迭代器的函数的有效参数(表示某个容器的std :: end())吗?

通过属性获取器访问std :: map返回垃圾值

模板C ++中的迭代器

通过`std :: string :: begin()`/`std :: string :: end()`进行迭代器无效?

STL迭代器,指针和std :: nullptr_t的模板函数

在C ++中将std :: sort与迭代器和模板一起使用