一、数组

一组具有相同数据类型数据的有序集合
数组元素的类型称为该数组的基类型

1.1定义与初始化

语法形式类型说明符 数组名[常量表达式][常量表达式]……

1.1.1使用

先声明,后使用
只能逐个引用数组元素,而不能一次引用整个数组

1.1.2存储

1、一维数组
数组元素在内存中顺次存放,它们的地址是连续的。元素间物理地址上的相邻,对应着逻辑次序上的相邻
2、二维数组
按行存放,如float a[3][4]可理解为:
其中数组a的存储顺序为:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23

1.1.3初始化

1、一维数组
在定义数组时给出数组元素的初始值

  • 列出全部元素的初始值
  • 只给一部分元素赋初值
  • 在对全部数组元素赋初值时,可以不指定数组长度
//分别对应上面三个
static int a[10]={0,1,2,3,4,5,6,7,8,9};
static int a[10]={0,1,2,3,4};
static int a[]={0,1,2,3,4,5,6,7,8,9};

2、二维数组

  • 将所有初值写在一个{}内,按顺序初始化
  • 分组列出二维数组元素的初值
  • 只对部分元素初始化
  • 列出全部初始值时,第1维下标个数可以省略
//分别对应上面四个
static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
static int a[3][4]={{1},{0,6},{0,0,11}};
static int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

如果不作任何初始化,内部auto型数组中会存在垃圾数据,static数组中的数据默认初始化为0
如果只对部分元素初始化,剩下的未显式初始化的元素,将自动被初始化为0

#include<iostream>
using namespace std;

const char key[] = { 'a', 'c', 'b', 'a', 'd' };
const int NUM = 5;

int main() {
    char c;
    int que = 0, correct = 0;
    cout << "Enter 5 answers:\n";
    while(cin.get(c)) {     //条件 " cin.get(c) " 中是句号而不是逗号
        if(c == '\n') {     //输入完通过回车显示结果,但换行符不能算作输入的内容
            cout << "\nScore " << (float)correct / NUM * 100 << "%\n";
            que = 0, correct = 0;   //计数器清零,且位于输出结果之后
        } else {
            if(c == key[que])
                correct++, cout << " "; //空格表示正确
            else
                cout << "*";    //星号表示错误
            que++;  //无论结果是否正确,数组下标都要后移
        }
    }
    return 0;
}

结果:
Enter 5 answers:
acbba
   **
Score 60%
acbad

Score 100%
abbda
 * **
Score 40%
bdcba
*****
Score 0%
^Z  //Ctrl + z 表示结束

1.2作函数参数

数组元素作实参,与单个变量一样
数组名作参数,形、实参数都应是数组名(实质上是地址),类型要一样,传送的是数组首地址

#include<iostream>
#include<cstdlib>
#include<ctime>     //第9行头文件
using namespace std;

void summary(int arr[][5], int n);

int main() {
    srand(time(NULL));  //产生随机数
    int arrey[3][5];
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 5; j++)
            arrey[i][j] = rand() % 10;
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 5; j++)
            cout << arrey[i][j] << ends;
        cout << endl;
    }
    summary(arrey,3);
    cout << "\n第一行和为:" << arrey[0][0] << endl
        << "第二行和为:" << arrey[1][0] << endl
        << "第三行和为:" << arrey[2][0] << endl;
    return 0;
}

void summary(int arr[][5], int n) { //注意向函数传递二维数组的方式
//  or int arr[][5] -> int (* arr)[5]
    for(int k = 0; k < n; k++)
        for(int m = 1; m < 5; m++)
            arr[k][0] += arr[k][m];
}

测试结果:(随机)
6 9 4 2 8
0 2 6 6 8
2 1 2 2 8

第一行和为:29
第二行和为:22
第三行和为:15 

1.3对象数组

1.3.1定义与访问

定义对象数组类名 数组名[元素个数]
访问对象数组元素数组名[下标].成员名

1.3.2初始化

数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象
通过初始化列表赋值,如Point a[2]={Point(1,2),Point(3,4)};
如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)

1.3.3数组元素所属类的构造函数

若元素所属的类不声明构造函数,则采用默认构造函数
各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数;各元素对象的初值要求为不同的值时,需要声明带形参的构造函数
当数组中每一个对象被删除时,系统都要调用一次析构函数

#include <iostream>
using namespace std;

class Point {
public:
    Point();
    ~Point();
    void move(int newX,int newY);
private:
    int x, y;
};

Point::Point() : x(0), y(0) {
    cout << "Default Constructor called" << endl;
}
Point::~Point() {
    cout << "Destructor called" << endl;
}
void Point::move(int newX,int newY) {
    x = newX, y = newY;
    cout << "Moving the point to (" << newX << ", " << newY << ")" << endl;
}

int main() {
    Point a[2]; //创建对象时调用构造函数初始化,且因为没有参数,调用的会是无参构造函数(如果有多个构造函数)
    for(int i = 0; i < 2; i++)
        a[i].move(i + 10, i + 20); //调用 move 函数赋值
    return 0;
}

结果:
Default Constructor called
Default Constructor called
Moving the point to (10, 20)
Moving the point to (11, 21)
Destructor called
Destructor called 

二、字符串

2.1字符数组(C风格)

2.1.1字符型数据

字符常量:用单引号括起来的一个字符,如'a','A'
字符变量:用char说明的变量
字符串常量:系统用字符数组的形式对其进行存储,各字符连续、顺序存放,每个字符占一个字节,以‘\0’结尾,相当于一个隐含创建的字符常量数组,如"China","123" 

2.1.2字符数据的输入输出

格式化输入输出函数:scanf(),printf(),"%c"
无格式输入输出函数:getchar(),putchar()

2.1.3字符数组

1、定义与初始化
语法形式char 数组名[维数说明]

char str[8] = { 'p', 'r', 'o', 'g', 'r', 'a', 'm', '\0' };
char str[8] = "program";
char str[] = "program";

2、引用
引用字符数组中的一个元素,得到一个字符
通过字符数组名字引用整个字符数组
3、字符串的输入输出
逐个字符输入输出,用 %c
整个字符串输入输出,用 %s
用 "%s" 格式符处理字符串时,scanf函数中的 输入项、printf函数中的输出项是字符数组名,如:printf("%s",a)
用 "%s" 格式符输入字符串时,scanf函数以空格作为分隔符
4、缺点
执行连接、拷贝、比较等操作,都需要显式调用库函数,很麻烦
当字符串长度很不确定时,需要用new动态创建字符数组,最后要用delete释放,很繁琐
字符串实际长度大于为它分配的空间时,会产生数组下标越界的错误

2.2 string 类

使用字符串类string表示字符串,string实际上是对字符数组操作的封装
string 并不是 C++ 语言本身具有的基本类型,它是在 C++ 标准库中声明的一个字符串类,用这种类可以定义对象,即每一个字符串变量都是 string 类的一个对象

2.2.1常用构造函数

string() 默认构造函数,建立一个长度为0的串,如string s1;
string(const char *s) 用指针s所指向的字符串常量初始化string对象,如string s2 = “abc”;
string(const string& rhs) 复制构造函数,如string s3 = s2;

2.2.2常用操作

  • s + t 将串s和t连接成一个新串
  • s = t 用 t 更新 s
  • s == t 判断 s 与 t 是否相等
  • s != t 判断 s 与 t 是否不等
  • s < t 判断 s 是否小于 t(按字典顺序比较)
  • s <= t 判断 s 是否小于或等于 t (按字典顺序比较)
  • s > t 判断 s 是否大于 t (按字典顺序比较)
  • s >= t 判断 s 是否大于或等于 t (按字典顺序比较)
  • s[ i ] 访问串中下标为 i 的字符
string s1 = "abc", s2 = "def";

string s3 = s1 + s2;?   //结果是"abcdef"
bool s4 = (s1 < s2);    //结果是true
char s5 = s2[1];    //结果是'e'

2.2.3输入整行字符串

cin 的 >> 操作符输入字符串,以空格作为分隔符,空格后的内容会在下一回输入时被读取
getline可以输入整行字符串(要包string头文件),如:getline(cin, s2);
输入字符串时,可以使用其它分隔符作为字符串结束的标志(如逗号、分号),将分隔符作为getline的第3个参数即可,如:getline(cin, s2, ',')

string、string.h、cstring区别
string 是 C++ 的头文件,其内包含了一个 string 类,string s1 就是建立一个 string 类的对象
string.h 是旧的 C 头文件,对应的是基于 char* 的字符串处理函数
cstring 是对应于旧的 C 头文件的 std 版本,实际上只是在一个命名空间 std 中 include 了 string.h

#include<iostream>
#include<string>
using namespace std;

inline void test(const char *title, bool value) {
    cout << title << " returns " << (value ? "true" : "false") << endl;
}

int main() {
    string s1 = "DEF";
    cout << "s1 is " << s1 << endl;
    string s2;
    cout << "Enter s2: ";
    cin >> s2;
    cout << "length of s2: " << s2.length() << endl;

    test("\ns1 <= \"ABC\"", s1 <= "ABC");
    test("\"DEF\" <= s1", "DEF" <= s1);

    s2 += s1;
    cout << "\ns2 = s2 + s1: " << s2 << endl;
    cout << "length of s2: " << s2.length() << "\n" << endl;

    string city, state;
    getline(cin, city, ',');
    getline(cin, state);
    cout << "City is " << city << "\tState is " << state << endl;
    return 0;
}

结果:
s1 is DEF
Enter s2: asdfjkl
length of s2: 7

s1 <= "ABC" returns false
"DEF" <= s1 returns true

s2 = s2 + s1: asdfjklDEF
length of s2: 10

hangZhou,zheJiang
City is hangZhou        State is zheJiang

C++——数组与字符串的更多相关文章

  1. Base-64 字符数组或字符串的长度无效等问题解决方案

    项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...

  2. c数组与字符串

    原文链接:http://www.orlion.ga/913/ 一.数组 定义数组: int count[9]; 赋值: int count[4] = { 3, 2, }; 未赋初值的元素用0初始化.如 ...

  3. C语言 第七章 数组与字符串

    一.数组 1.1.数组的概念 用来存储一组相同类型数据的数据结构.有点像班上放手机的手机袋,超市的储物柜. 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. ...

  4. js对象、数组转换字符串

    对象转换成字符串需要使用toString()方法. 1 var a = function(){ 2 console.log(111); 3 }; 4 var b = a.toString(); 5 c ...

  5. javascript中数组和字符串的方法比较

    × 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...

  6. json对象,数组,字符串总结

    关于json对象,数组,字符串的总结 什么是json? JSON(JavaScript Object Notation)  一种轻量级的数据交换格式,JSON采用完全独立于语言的文本格式...(来自百 ...

  7. @proprety数组字典字符串用copy和strong区别(深浅拷贝)

    ////  @proprety数组字典字符串用copy和strong区别(深浅拷贝).h//  IOS笔记//// /* _proprety________copy_strong_________h ...

  8. php byte数组与字符串转换类

    <?php /** * byte数组与字符串转化类 * @author ZT */ class Bytes { /** * 转换一个string字符串为byte数组 * @param $str ...

  9. 关于PHP数组转字符串详细介绍

    随着时代的发展,我们的开发技术也随着更新,对于PHP还是比较常用的,于是我研究了一下PHP数组转字符串,在这里拿出来和大家分享一下,希望对大家有用. 经常需要使用PHP处理字符string,PHP内置 ...

  10. PHP基础语法: echo,var_dump, 常用函数:随机数:拆分字符串:explode()、rand()、日期时间:time()、字符串转化为时间戳:strtotime()可变参数的函数:PHP里数组长度表示方法:count($attr[指数组]);字符串长度:strlen($a)

    PHP语言原理:先把代码显示在源代码中,再通过浏览器解析在网页上 a. 1.substr;  //用于输出字符串中,需要的某一部分 <?PHP $a="learn php"; ...

随机推荐

  1. vmware中设置ubuntu静态ip

    概括一下过程中遇到的三个问题: 1.如何修改虚拟机为静态ip并且生效 2.设置完静态ip后,无法上网 3.设置完静态ip且能上网后,宿主机无法ping通虚拟机 问题1:参考https://www.ji ...

  2. CodeForces Round 521 div3

    A:Frog Jumping 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_i ...

  3. Codeforces Round #385 (Div. 2) C - Hongcow Builds A Nation

    题目链接:http://codeforces.com/contest/745/problem/C 题意:给出n个点m条边,还有k个不能连通的点,问最多能添加几条边. 要知道如果有n个点最多的边是n*( ...

  4. [NOI1995]石子合并 题解

    一道经典的dp题 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子 ...

  5. Increasing heap size while building the android source code on Ubuntu 15.10

    http://stackoverflow.com/questions/34940793/increasing-heap-size-while-building-the-android-source-c ...

  6. PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性

    关系数组 array("key"=>"value",...) ; get没有数据大小的限制 post上传大小没有限制 不指定上传方式,默认是get 文件上 ...

  7. 结合生活案例实现rabbitmq消息通信

    title: 基于springboot实现rabbitmq消息通信 date: 2019-09-11 09:00:30 tags: - [rabbitmq] categories: - [spring ...

  8. 对TD tree系统评价及改进

    该系统是由石家庄铁道大学2017级信息学院的同学研发并改进,分享给我们18级新生的一份体验,这项app可安装在任意一个智能手机上,当听到学长们像我们介绍这款app的时候,着实让我惊呆了,惊叹学长们的编 ...

  9. Mybatis打印SQL

    配置mybatis日志级别,打印SQL 1.方案一:配置日志级别 logging.level.org.springboot.demo.mapper=debug 其中org.springboot.dem ...

  10. 仿QQ5.0侧滑菜单

    一.概述 侧滑菜单现在已经非常流行了,目前大概有这么几种:最普通的侧滑,抽屉侧滑,QQ侧滑 注:本文来自慕课网 二.最普通的侧滑 先上图 代码如下: public class MainActivity ...