为什么需要vector?
1.封装任何类型的动态数组,自动创建和删除 2.数组下标越界检查.
vector对象的定义
vector<元素类型> 数组对象名(数组长度);
例:
vector<int>arr(5) 建立大小为5的int数组
vector对象的使用
1.对数组元素的引用
与普通数组具有相同形式:
vector对象名[下标表达式]
vector数组对象名不表示数组首地址
2.获得数组长度
用size函数
vector对象名.size()
#include<iostream>
#include <vector>
using namespace std;
double average(const vector<double> &arr) {
double sum = 0;
for (unsigned i = 0; i < arr.size(); i++)
{
sum += arr[i];
return sum / arr.size();
}
}
int main() {
unsigned n;
cout << "n=";
cin >> n;
vector<double>arr(n);
cout << "Please input" << n << "real numbers:" << endl;
for (unsigned i = 0; i < n; i++)
{
cin >> arr[i];
}
cout << "Average=" << average(arr) << endl;
return 0;
}
深层复制与浅层复制
浅层复制
实现对象间数据元素的一一对应复制
#include<iostream>
#include <cassert>
using namespace std;
class Point
{
public:
Point() :x(0), y(0) {
cout << "Defaule Constructor called." << endl;
}
Point(int x, int y) :x(x), y(y) {
cout << "Constructor called." << endl;
}
~Point()
{
cout << "Destructor called." << endl;
}
int getX()const { return x; }
int getY()const { return y; }
void move(int newX, int newY) {
x = newX;
y = newY;
}
private:
int x, y;
};
class ArrayOfPoints {
public:
ArrayOfPoints(int size) :size(size) {
points = new Point[size];
}
~ArrayOfPoints() {
cout << "Deleting..." << endl;
delete[] points;
}
Point& element(int index) {
assert(index >= 0 && index < size);
return points[index];
}
private:
Point* points;
int size;
};
int main() {
int count;
cout << "Please enter the count of points:";
cin >> count;
ArrayOfPoints pointsArray1(count);
pointsArray1.element(0).move(5, 10);
pointsArray1.element(1).move(15, 20);
ArrayOfPoints pointsArray2(pointsArray1);
cout << "Copy of pointsArray1:" << endl;
cout << "Point_0 of array2:" << pointsArray2.element(0).getX() << "," << pointsArray2.element(0).getY() << endl;
cout << "Point_1 of array2:" << pointsArray2.element(1).getX() << "," << pointsArray2.element(1).getY() << endl;
pointsArray1.element(0).move(25, 30);
pointsArray1.element(1).move(35, 40);
cout << "After the moving of pointsArray1:" << endl;
cout << "Point_0 of array2:" << pointsArray2.element(0).getX() << "," << pointsArray2.element(0).getY() << endl;
cout << "Point_1 of array2:" << pointsArray2.element(1).getX() << "," << pointsArray2.element(1).getY() << endl;
return 0;
}
深层复制
当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指对象进行复制
#include<iostream>
#include <cassert>
using namespace std;
class Point
{
public:
Point() :x(0), y(0) {
cout << "Defaule Constructor called." << endl;
}
Point(int x, int y) :x(x), y(y) {
cout << "Constructor called." << endl;
}
~Point()
{
cout << "Destructor called." << endl;
}
int getX()const { return x; }
int getY()const { return y; }
void move(int newX, int newY) {
x = newX;
y = newY;
}
private:
int x, y;
};
class ArrayOfPoints {
public:
ArrayOfPoints(int size) :size(size) {
points = new Point[size];
}
ArrayOfPoints(const ArrayOfPoints& v);
~ArrayOfPoints() {
cout << "Deleting..." << endl;
delete[] points;
}
Point& element(int index) {
assert(index >= 0 && index < size);
return points[index];
}
private:
Point* points;
int size;
};
ArrayOfPoints::ArrayOfPoints(const ArrayOfPoints& v) {
size = v.size;
points = new Point[size];
for (int i = 0; i < size; i++)
{
points[i] = v.points[i];
}
}
int main() {
int count;
cout << "Please enter the count of points:";
cin >> count;
ArrayOfPoints pointsArray1(count);
pointsArray1.element(0).move(5, 10);
pointsArray1.element(1).move(15, 20);
ArrayOfPoints pointsArray2(pointsArray1);
cout << "Copy of pointsArray1:" << endl;
cout << "Point_0 of array2:" << pointsArray2.element(0).getX() << "," << pointsArray2.element(0).getY() << endl;
cout << "Point_1 of array2:" << pointsArray2.element(1).getX() << "," << pointsArray2.element(1).getY() << endl;
pointsArray1.element(0).move(25, 30);
pointsArray1.element(1).move(35, 40);
cout << "After the moving of pointsArray1:" << endl;
cout << "Point_0 of array2:" << pointsArray2.element(0).getX() << "," << pointsArray2.element(0).getY() << endl;
cout << "Point_1 of array2:" << pointsArray2.element(1).getX() << "," << pointsArray2.element(1).getY() << endl;
return 0;
}