面试题答案
一键面试- 引入必要的头文件:
#include <iostream> #include <vector> #include <concepts>
- 定义概念:
这里定义了一个名为template <typename It> concept RandomAccessIterator = std::is_convertible_v< typename std::iterator_traits<It>::iterator_category, std::random_access_iterator_tag>;
RandomAccessIterator
的概念,用于判断一个类型It
是否是随机访问迭代器。std::is_convertible_v
用于检查迭代器的类别是否可以转换为std::random_access_iterator_tag
。 - 实现模板函数:
模板函数template <RandomAccessIterator It1, RandomAccessIterator It2> requires std::same_as<typename std::iterator_traits<It1>::value_type, typename std::iterator_traits<It2>::value_type> void addElements(It1 first1, It1 last1, It2 first2) { auto it1 = first1; auto it2 = first2; while (it1 != last1) { *it1 = *it1 + *it2; ++it1; ++it2; } }
addElements
接受两个随机访问迭代器It1
和It2
。requires
子句用于进一步约束,确保两个迭代器指向的元素类型相同(使用std::same_as
)。在函数内部,通过迭代两个迭代器,对指向的元素进行加法操作。 - 测试函数:
在int main() { std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = {4, 5, 6}; addElements(vec1.begin(), vec1.end(), vec2.begin()); for (int num : vec1) { std::cout << num << " "; } return 0; }
main
函数中,创建两个std::vector<int>
,调用addElements
函数对其元素进行加法操作,并输出结果。
通过上述步骤,利用concepts
定义了迭代器的约束,通过类型推导确定迭代器类型,从而实现了对随机访问迭代器指向元素的加法操作。