编写一个具有以下原型的函数模板 Template<class T> Void exchange (list<T>&l1,list<T>::iterator p1,list<T>&l2,list<T>::iterator p2); 该模板用于将l1链表的[pl.ll.end()区间和l2链表的[p2,l2.end())区间的内容交换.在主函数中调用该模板,以测试该模板的正确性
时间: 2024-03-24 11:40:36 浏览: 87
好的,我理解了你的要求。以下是实现该函数模板的代码:
```cpp
#include <iostream>
#include <list>
template<class T>
void exchange(list<T>& l1, typename list<T>::iterator p1, list<T>& l2, typename list<T>::iterator p2) {
l1.splice(p1, l2, p2, l2.end()); // 交换区间
}
int main() {
list<int> l1 = {1, 2, 3, 4, 5};
list<int> l2 = {6, 7, 8, 9, 10};
auto p1 = l1.begin();
advance(p1, 2); // p1 指向 l1 的第 3 个元素
auto p2 = l2.begin();
advance(p2, 1); // p2 指向 l2 的第 2 个元素
exchange(l1, p1, l2, p2); // 交换 l1 和 l2 的区间
for (auto x : l1) {
std::cout << x << " "; // 输出 l1
}
std::cout << std::endl;
for (auto x : l2) {
std::cout << x << " "; // 输出 l2
}
std::cout << std::endl;
return 0;
}
```
在这个程序中,我们首先定义了一个函数模板 `exchange`,它接受两个链表 `l1` 和 `l2` 以及两个迭代器 `p1` 和 `p2`。该模板使用 `splice` 函数将 `l2` 的区间 `[p2,l2.end())` 移动到 `l1` 的位置 `p1` 处,从而实现了两个链表区间的交换。
在主函数中,我们创建了两个链表 `l1` 和 `l2`,并定义了迭代器 `p1` 和 `p2`,它们分别指向 `l1` 的第 3 个元素和 `l2` 的第 2 个元素。接着,我们调用 `exchange` 函数,将 `l1` 和 `l2` 的区间进行了交换。最后,我们分别输出了交换后的两个链表。
请注意,为了在函数模板中使用 `list<T>::iterator` 类型,我们需要在迭代器前面加上 `typename` 关键字,以告诉编译器这是一个类型名。
阅读全文