函数模板
类模板
#include <iostream>
using namespace std;
struct Student {
int id;
float gpa;
};
template <class T>
class Store{
private:
T item;
bool haveValue;
public:
Store();
T &getElem();
void putElem(const T &x);
};
template <class T>
Store<T>::Store():haveValue(false){}
template <class T>
T &Store<T>::getElem() {
if(!haveValue){
cout << "No item present " << endl;
exit(1);
}
return item;
}
template <class T>
void Store<T>::putElem(const T &x) {
haveValue = true;
item = x;
}
int main(){
Store<int> a;
a.putElem(10);
cout << a.getElem() << endl;
Student g = {1000,23};
Store<Student> s3;
s3.putElem(g);
cout << "the student id is" << s3.getElem().id << endl;
cout << "the student gpa is" << s3.getElem().gpa << endl;
Store<double> d;
cout << "Retrieving object D... ";
cout << d.getElem() << endl;
return 0;
}
线性群体
线性群体中的元素次序与其逻辑位置关系是对应的。 在线性群体中,又可以按照访问元素的不同方法分为:
数组类模板
为什么有的函数返回引用
- 如果一个函数的返回值是一个对象的值,就是右值,不能成为左值。
- 如果返回值为引用。由于引用是对象的别名,通过引用可以改变对象的值,因此是左值
#ifndef ARRAY_H
#define ARRAY_H
#include <cassert>
template <class T>
class Array{
private:
T* list;
int size;
public:
Array(int sz = 50);
Array(const Array<T> &a);
~Array();
Array<T> & operator = (const Array<T> &rhs);
T & operator [] (int i);
const T & operator [] (int i) const;
operator T * ();
operator const T * () const;
int getSize() const;
void resize(int sz);
};
template <class T> Array<T>::Array(int sz) {
assert(sz >= 0);
size = sz;
list = new T [size];
}
template <class T> Array<T>::~Array(){
delete [] list;
}
template <class T>
Array<T>::Array(const Array<T> &a){
size = a.size;
list = new T[size];
for(int i = 0; i < size; i++)
list[i] = a.list[i];
}
template <class T>
Array<T> &Array<T>::operator = (const Array<T> &rhs){
if(&rhs != this){
if(size != rhs.size){
delete [] list;
size = rhs.size;
list = new T[size];
}
for(int i = 0; i < size; i++){
list[i] = rhs.list[i];
}
}
return *this;
}
template <class T>
T & Array<T>::operator [](int n){
assert(n >= 0 && n < size);
return list[n];
}
template <class T>
const T & Array<T>::operator [](int n) const {
assert(n >= 0 && n < size);
return list[n];
}
template <class T>
Array<T>::operator T * () {
return list;
}
template <class T>
int Array<T>::getSize() const {
return size;
}
template <class T>
void Array<T>::resize(int sz) {
assert(sz >= 0);
if(sz == size)
return;
T* newList = new T [sz];
int n = (sz < size) ? sz :size;
for(int i = 0; i < n; i++)
newList[i] = list[i];
delete[] list;
list = newList;
size = sz;
return;
}
#endif
iomanip,在C++程序里面经常见到下面的头文件#include <iomanip>,io代表输入输出,manip是manipulator(操纵器)的缩写(在c++上只能通过输入缩写才有效)。
C++中setw()函数
#include <iostream>
#include <iomanip>
#include "Array.h"
using namespace std;
int main(){
Array<int> a(10);
int n, count = 0;
cout << "Enter a value >= 2 as upper limit for prime numbers: ";
cin >> n;
for (int i = 2; i <= n; i++) {
bool isPrime = true;
for (int j = 0; j < count; j++)
if (i % a[j] == 0) {
isPrime = false; break;
}
if (isPrime) {
if (count == a.getSize())
a.resize(count * 2);
a[count++] = i;
}
}
for (int i = 0; i < count; i++)
cout << setw(8) << a[i];
cout << endl;
return 0;
}
(第九章暂时未看) 链表 链表的概念与结点类模板 链表类模板 第九章 模板与群体数据–链表 栈 栈类模板 栈类模板课后习题 例9-9 栈的应用 队列 队列类模板 第九章 模板与群体数据–队列 排序 排序概述 插入排序 选择排序 交换排序 第九章 模板与群体数据–排序 查找 查找 查找课后习题 小结 小结
|