gpt4 book ai didi

c++ - 非类型模板参数可以在 STL 容器上完成吗?

转载 作者:太空狗 更新时间:2023-10-29 20:19:35 25 4
gpt4 key购买 nike

template<typename T,int nSize>
T Sum(T (&parr)[nSize])
{
T sum=0;
for(int i = 0; i < nSize ;++i)
{
sum += parr[i];
}
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
int nArr[] = {1,2,3,4};
int nSum = Sum(nArr);
std::cout<<"Sum :"<<nSum;
}

能否使用 std::vector 代替 array。或者 array 能否被任何 STL 容器替换?

最佳答案

Can std::vector be used instead of array.Or can array be replaced by any of the stl containers?

没有。这是不可能的,因为它们的类型不同。但是您可以通过以下方式概括给定的函数。

使用容器的开始和结束迭代器创建一个模板函数。然后使用 std::accumulate , 总结元素,这将适用于 any sequence containers 以及数组:

以下是示例代码:( See live online )

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <numeric> // std::accumulate
#include <iterator> // std::iterator_traits, std::cbegin, std::cend

template<typename Iterator>
constexpr auto Sum(Iterator begin, const Iterator end) -> typename std::iterator_traits<Iterator>::value_type
{
using RetType = typename std::iterator_traits<Iterator>::value_type;
return std::accumulate(begin, end, RetType{});
}

int main()
{
int nArr[] = { 1,2,3,4 };
std::vector<int> vec{ 1,2,3,4 };
std::list<int> list{ 1,2,3,4 };
// now you can
std::cout << "Sum of array: " << Sum(std::cbegin(nArr), std::cend(nArr)) << "\n";
std::cout << "Sum of vec: " << Sum(std::cbegin(vec), std::cend(vec)) << "\n";
std::cout << "Sum of list: " << Sum(std::cbegin(list), std::cend(list)) << "\n";
}

输出:

Sum of array: 10
Sum of vec: 10
Sum of list: 10

关于c++ - 非类型模板参数可以在 STL 容器上完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58059586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com