模板容器迭代器
Template container iterators
本文关键字:迭代器 更新时间:2023-10-16
我正在处理家庭作业问题,我无法汇编这个问题:
我需要编写接受两个迭代器(对于任何容器)的功能,然后将最小值和最大值作为一对
返回这是我遇到的错误:
Error 1 error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'
Error 2 error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'
Error 3 error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'
这是我的代码:
template <typename It, typename T>
std::pair<T,T> problem1(It start, It end)
{
// initial min max
T min = *start;
T max = *start;
It curr = start;
while (curr != end)
{
// check if we have a new min or max
if (min > *curr)
min = *curr;
if (max < *curr)
max = *curr;
curr++; // get next
}
return std::make_pair(min, max);
}
该代码正在使用以下代码进行测试,我无法修改。
std::vector<int> a = { 1, 3, 12, -8, 22, 5, 41, 33 };
std::list<double> b = { 0.8, -123, 44, 56, 12, 231 };
std::array<unsigned int, 1> c;
c[0] = 12;
auto a_ans = problem1(a.begin(), a.end());
auto b_ans = problem1(b.begin(), b.end());
auto c_ans = problem1(c.begin(), c.end());
if (*a_ans.first == -8 && *a_ans.second == 41 &&
*b_ans.first == -123 && *b_ans.second == 231 &&
*c_ans.first == 12 && *c_ans.second == 12) {
std::cout << "Test 1 passed.n";
score += 10;
}
else {
std::cout << "Test 1 failed.n";
}
编译器告诉您的是,它无法从您提供给函数的参数中找出T
。函数上的模板参数要么必须明确提供(a_ans = problem1<vector<int>::iterator, int>(a.begin(), b.begin())
),要么必须从函数参数中扣除(编译器猜测基于start
和end
参数的It
)。
幸运的是,迭代器具有value_type
成员:
template <typename It>
std::pair<typename It::value_type, typename It::value_type> problem1(It start, It end)
{
// initial min max
typename It::value_type min = *start;
typename It::value_type max = *start;
It curr = start;
while (curr != end)
{
// check if we have a new min or max
if (min > *curr)
min = *curr;
if (max < *curr)
max = *curr;
curr++; // get next
}
return std::make_pair(min, max);
}
基本上,您将T
替换为typename It::value_type
。之所以起作用,是因为迭代器类型知道它们的价值类型,并且这也可以使用前C 11(如果您的老师对新语言版本害羞)。
编译器无法知道T
类型是什么。您可以从模板中删除它,然后使用decltype(*start)
。
使用decltype的优点是它将与原始指针和非标准迭代器一起使用(与:: value_type不同)
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?