0%

6-数组

[TOC]

6.1 数组

new 是C++的一个关键字,它通常用来在堆上创建数组或对象,但会返回一个指向这个对象的指针

类名 数组名[常量表达式]

数组名[下标].成员名

初始化就是调用成员的构造函数

1
2
3
4
5
6
7
8
9
class Location{
public:
Location():x(0),y(0){}
Location(int xx,int yy):x(xx),y(yy){}
private:
int x,y;
};

Location a[2] = {Location(1,2)};//a[1]调用默认构造函数

6.1.1 数组名作为形参

以数组名为形参传递参数,被调函数体中对数组内容的改变会影响主调函数的数组值——数组名为连续地址的首地址(指针)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# include<iostream>
using namespace std;

void rowsum(int a[][4],int row){
for(int i = 0;i < row;++i)
for(int j = 0;j < 4;++j)
a[i][0] += a[i][j];
}

int main(){
int table[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};
for(int i = 0;i < 3;++i){
for(int j = 0;j < 4;++j)
cout << table[i][j] << " ";

cout << endl;
}

rowsum(table,3);
for(int i = 0;i < 3;++i)
cout << "sum of row" << i << " is " << table[i][0] << endl;

return 0;
}
/*运行结果*/
1 2 3 4
2 3 4 5
3 4 5 6
sum of row0 is 11
sum of row1 is 16
sum of row2 is 21

6.2 动态内存分配

6.2.1 建立,删除堆对象new,delete

1
2
3
4
5
new 数据类型(初始化参数列表);//申请成功,返回首地址
int *point;
point = new int(2);//*point = 2;
point = new int();// *point = 0;
point = new int;//不初始化

声明对象内存空间时

  • 若定义默认构造函数, new Tnew T() 相同

  • 未定义,对该函数的基本数据类型和指针类型数据成员都会被以0赋值

6.2.2 创建、删除数组类型对象

1
2
3
4
5
6
new 类型[数组长度];
delete[] 数组名//加方括号区分普通类型

/*多维数组的申请*/
float* p[25][10];//指针数组
p = new float[10][25][10];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*动态数组类*/
class ArrayOfPoints{
public:
ArrayOfPoints(int size):size(size){
points = new Point[size];
}
~ArrayOfPoints(){delete[] Points;}
Point &element(int index){
assert(index >= 0 && index < size);
//在编译模式下起作用,表达式true,继续执行;false,程序终止
return Points[index];
}
private:
Point *points;
int size;
}

6.2.3 用vector创建数组对象

1
2
vector<元素类型>数组对象名(数组长度,元素初值);//只能指定相同初值
数组对象名[下标表达式];

vector 创建数组对象,并不是数组,数组名不代表数组首地址

所有元素都会被初始化,只能初始化为相同初值

  • 基本数据类型为0
  • class类型,调用默认构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# include<iostream>
# include<vector>

using namespace std;

double average(const vector<double>&arr)//引用arr 数组{
double sum = 0.0;
for(int i = 0;i < arr.size();++i)
sum += arr[i];
return sum / arr.size();
}

int main(){
int n;
cin >> n;

vector<double>arr(n);
for(int i = 0;i < n;++i)
cin >> arr[i];

cout << "Average is:" << average(arr) << endl;

return 0;
}

6.3 C++字符串——string类

6.3.1 字符串构造函数及重载形式

1
2
3
4
5
6
7
string();//默认构造函数,建立长度为0的字符串
string(const char *s);//用指针s所指向的字符串常量初始化string类的对象
string(const string &rhs,unsigned int pos,unsiged int n);//从rhs的第pos个位置开始取n个字符,用来初始化string类的对象
string(const char *s,unsigned int n);//用指针s所指向的前n个字符初始化
string(unsigned int n,char c);//用c重复n次初始化
===
string(const string &rhs);//复制构造函数

6.3.2 操作符

运算

+ :拼接

= :赋值

+= :拼接后赋值

关系运算

==

!=

<

>

>=

<=

访问

str[i] :访问下标为i的元素

常用成员函数

1
2
3
4
5
6
7
8
9
10
11
string append(const char *s);//将s追加在尾
string assign(const char*s);//赋值
int compare(const string &str)const;//比较本串与str的大小

string &insert(unsigned int p0,const char *s);//将s指向的字符串插入在本串中p0位置
string substr(unsigned int pos,unsigned int n) const;
//取本串中pos开始的n个字符,返回新串

void swap(string &str);//与str字符串交换
unsigned int find(const basic_string &str) const;//查找并返回str在本串中第一次出现的位置
unsigned int length() const;//返回串的长度

6.3.3 getline(cin,串名,分割符)

输入字符串至行末,以指定分隔符为终止(默认空格)

-------------本文结束-------------