最近,小明同学学习了泛型编程技术——模板,了解了函数模板与类模板的设计,并且设计了不少基于模板技术实现的函数和类,你特别羡慕小明掌握了这些编程的技术,于是你用了几顿饭的代价,从小明那里学到了相关的知识,并想尝试一下。数学上,我们学过集合(元素不重复),现在请你用一个动态有序数组来表示集合,并能动态增加集合的大小(容量)。经过前期的实验,你基本熟悉了相关知识,并已经设计好了类模板框架,设计了几个简单的成员函数,在此基础上,请你实现类模板的如下成员函数,具体要求: (1) 成员函数find,从集合中查找某元素e,返回该元素在集合中的位序(数组下标),若不存在,则返回-1;因集合有序,为提高查找效率,建议使用折半查找(二分查找)。 (2) 成员函数insert,向集合中插入元素e,根据集合的特性(元素不重复),若该元素已存在,则不插入该元素;否则,若集合已满,则需调整集合容量,再插入。因集合有序,并不是将元素插入到集合末尾! (3) 实现成员函数print,输出集合中的所有元素,所有元素之间以空格分隔,最后一个元素后不输出空格,输出结束后换行;空集输出一个空行即可。
时间: 2024-03-17 13:45:33 浏览: 210
好的,根据您的要求,我来实现一个动态有序数组来表示集合,并实现类模板的查找、插入和输出函数。
首先,我们可以使用一个数组来存储集合中的元素,并使用一个整数来记录集合的大小。为了方便起见,我们可以将数组的大小设为集合的容量,每当数组的大小不足以存储所有元素时,我们就需要调整数组的大小(例如将数组的大小扩大一倍)。
以下是实现集合类模板的关键代码:
```cpp
template<typename T>
class Set {
public:
Set() : data(nullptr), size(0), capacity(0) {};
~Set() {
if (data != nullptr) {
delete[] data;
}
}
int find(const T& e) const {
int left = 0, right = size - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (data[mid] == e) {
return mid;
} else if (data[mid] < e) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
void insert(const T& e) {
int pos = find(e);
if (pos == -1) { // 元素不存在
if (size == capacity) { // 扩容
int newCapacity = capacity == 0 ? 1 : capacity * 2;
T* newData = new T[newCapacity];
for (int i = 0; i < size; ++i) {
newData[i] = data[i];
}
if (data != nullptr) {
delete[] data;
}
data = newData;
capacity = newCapacity;
}
int insertPos = 0;
while (insertPos < size && data[insertPos] < e) {
insertPos++;
}
for (int i = size; i > insertPos; --i) {
data[i] = data[i - 1];
}
data[insertPos] = e;
size++;
}
}
void print() const {
if (size == 0) {
cout << endl;
return;
}
for (int i = 0; i < size - 1; ++i) {
cout << data[i] << " ";
}
cout << data[size - 1] << endl;
}
private:
T* data;
int size;
int capacity;
};
```
在这个类模板中,我们使用了一个数组data来存储集合中的元素,使用一个整数size来记录集合的大小,使用另一个整数capacity来记录数组的容量。成员函数find使用的是二分查找算法,时间复杂度为O(log n)。成员函数insert首先调用find函数来检查元素是否已经存在,如果不存在,则根据集合的有序性和插入位置来插入元素,时间复杂度为O(n)。成员函数print用于输出集合中的所有元素,时间复杂度为O(n)。
接下来,我们可以使用以下代码来测试这个集合类模板:
```cpp
Set<int> s;
s.insert(1);
s.insert(3);
s.insert(2);
s.insert(4);
s.print(); // 输出1 2 3 4
int pos = s.find(3);
if (pos != -1) {
cout << "Found at position " << pos << endl; // 输出Found at position 2
} else {
cout << "Not found" << endl;
}
```
希望对您有所帮助!
阅读全文