IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 第3章 字符串、向量和数组【C++】 -> 正文阅读

[C++知识库]第3章 字符串、向量和数组【C++】

第3章 字符串、向量和数组

命名空间的using声明

目前为止我们使用的库函数基本都属于命名空间std,如std::cin 、std::cout。其中::我们称其为作用域操作符,编译起编译起从操作符左侧名字的作用域寻找右侧那个名字。

但是上面很繁琐、允许我们通过using声明

//example1.cpp
#include<iostream>
using std::cout;
using std::endl;
int main(int argc,char**argv){
    const char*name="gaowanlu";
    cout<<name<<endl;//gaowanlu
    std::cout<<name<<std::endl;//gaowanlu
    return 0;
}

这样在这个cpp内使用std::cout与std::endl时就可以省略写std::了,但是仍然允许我们显式指定其明明空间

头文件不应包含using声明

头文件一般不使用using声明,因为头文件的内容会被拷贝到,include它的cpp去,如果头文件有using声明,则那些cpp内也会有这些using声明,可能会引起明明冲突

//example2.h
#ifndef __EXAMPLE2_H__
#define __EXAMPLE2_H__

using std::cout;

#endif

当第4行代码不被注释掉时,则会引入using std::cout; 当main函数内使用cout,编译器则不会知道知道我们要使用std::cout还是自定义的cout,进而产生命名出错

总之不要在头文件内使用using声明

//example2.cpp
#include<iostream>
#include<cstdio>

//#include"./example2.h"

int cout(){
    printf("printf hallo");
}

int main(int argc,char**argv){
    cout();//printf hallo
    return 0;
}

标准库类型string

首先要导入 #include<string> 其命名空间为 std::string

在C语言中是没有字符串类型的,但可以用字符数组进行存储,以 \0 表示字符串结束

定义和初始化string对象

6种直接初始化方式、1种拷贝初始化方式

    1、string s5;          //空串
    2、string s6(s5);      // s6为s5的副本 也就是拷贝s5到s6
    3、string s7 = "ak47"; // s7为字面值的副本
    4、string s8 = s7;
    5、string s9("94");
    6、string s10(1, 'h');
    7、string s11=std::string("hello world");

样例程序

//example3.cpp
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main(int argc, char **argv)
{
    string s1; //默认初始化为空字符串
    string s2 = "gaowanlu";
    string s3 = s2; // s3为s2内容的副本
    string s4(4, 'a');
    cout << s2 << endl; // gaowanlu
    cout << s3 << endl; // gaownalu
    cout << s4 << endl; // aaaa

    // string的7种初始化方式
    // 6种直接初始化方式
    string s5;          //空串
    string s6(s5);      // s6为s5的副本 也就是拷贝s5到s6
    string s7 = "ak47"; // s7为字面值的副本
    string s8 = s7;
    string s9("94");
    string s10(1, 'h');
    cout << s5 << endl;  //
    cout << s6 << endl;  //
    cout << s7 << endl;  // ak47
    cout << s8 << endl;  // ak47
    cout << s8 << endl;  // ak47
    cout << s9 << endl;  // 94
    cout << s10 << endl; // h
    // 1种拷贝初始化
    string s11 = std::string("hello world");
    cout << s11 << endl; // hello world
    return 0;
}

string对象上的操作

在C++中string是一种标准库里的对象,其支持丰富的操作

//example4.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
    string s1("hello world");
    string s2 = "hello world";

支持写入到输出流 outputstream<<str

    cout << s1 << endl; // hello world

同理支持从输入流写入到字符串 inputstream>>s1

    // cin>>s1;

从输入流中读取一行到字符串getline(inputstream,str)

    // getline(cin, s1); //这里我们使用标准输入流
    // cout << s1 << endl;

检测字符串是否为空字符串 str.empty()

    cout << s1.empty() << endl; // false 则s1不为空

获取字符串长度

    cout << s1.size() << endl; // 11

获取第n个字符的引用 n 0开始为第一个字符

    char &ch = s1[0];
    ch = 'p';
    s1[3] = 'k';
    cout << s1 << endl; // pelko world

字符串拼接

    string s3 = s1 + s2;
    s3+="";//支持+=
    cout << s3 << endl;          // pelko worldhello world
    cout << s3 + "HAHA" << endl; // pelko worldhello worldHAHA

字符串复制

    string s4 = s3;

s4与s3没有关系,只是内容相同,它们的数据存放在不同的内存上面

    cout << s4 << endl; // pelko worldhello world

字符串的比较

    cout << (s3 == s4) << endl; // 1 即true
    cout << (s3 != s4) << endl; // 0 即false

字典顺序比较

    string s5 = "abcd";
    string s6 = "abda";
    cout << (s5 < s6) << endl;  // 1 abcd abda c<d
    cout << (s5 <= s6) << endl; // 1 abcd abda c<=d
    cout << (s5 > s6) << endl;  // 0 abcd abda c<d
    cout << (s5 >= s6) << endl; // 0 abcd abda c<=d
    return 0;
}

getline函数的返回值

//example5.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
    string s1;
    while (getline(cin, s1)) // getline返回文件到达末尾也就是cin流的内容是否全部到头
    {
        cout << s1 << endl;
    }
    //只有退出程序时cin才会关闭以至于getline返回false
    //与其类似的操作还有
    /*
    while (cin >> s1)
    {
        cout << s1 << endl;
    }*/
    return 0;
}

std::string::size_type类型

其字符串size()方法返回值用什么类型存储比较好,C++为我们提供了std::string::sizetype类型

//example6.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
    std::string s1("hello");
    std::string::size_type s1_length = s1.size();
    cout << s1_length << endl;                      // 5
    cout << sizeof(std::string::size_type) << endl; // 4
    
    // str.size()返回一个无符号整数
    //当然我们可以使用我们前面学到的auto 与 decltype
    auto l1 = s1.size();
    decltype(s1.size()) l2 = s1.size();
    cout << l1 << endl; // 5
    cout << l2 << endl; // 5

    //当然可以用unsigned 或者 int
    unsigned l3 = s1.size();
    int l4 = s1.size();
    cout << l3 << " " << l4 << endl; // 5 5
    return 0;
}

字符串相加要注意的事

字符串字面值不能与字符串字面值相加、相加对于string对象有效,即+号的左右至少有一个string对象

//example7.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
    //字符串对象与字符串对象相加返回字符串对象
    //字符串对象与字面值相加返回字符串对象
    //字面值与字面值相加发生错误

    // string s1 = "12" + "sdc";
    //  invalid operands of types 'const char [3]' and 'const char [4]' to binary 'operator+'
    //字面值被作为const char[] 处理

    string s2 = "a";
    s2 = s2 + " b " + "c ";
    //(s2+" b ")+"c "
    cout << s2 << endl; // a b c

    return 0;
}

这是为什么呢,C++为了与C语言兼容,所以C++语言中的字符串并不是作为std::stirng对象处理的

处理string对象中的字符

#include<cctype>

isalnum(c);//当c是字母或数字时为真
isalpha(c);//当c是字母时返回真
iscntrl(c);//当c是控制字符时为真
isdigit(c);//当c是数字时为真
isgraph(c);//当c不是空格但可以打印时为真
islower(c);//当c是小写字母时为真
isprint(c);//当c是可打印字符时为真(即c是空格或c具有可视化形式)
ispunct(c);//当c是标点符号时为真(不是控制字符、数字、字母、可打印空白)
isspace(c);//当c是空白时为真(即是空格、横向制表符、纵向制表符、回车符、换行符、进纸符)
isupper(c);//当c为大写字母时为真
isxdigit(c);//当c是十六进制数字时为真
tolower(c);//如果c是大写字母,输出对应的小写字母,否则原样输出c
toupper(c);//如果是小写字母、输出对应的大写字母,否则原样输出

如toupper使用

//exmaple8.cpp
#include <iostream>
#include <cctype>
using namespace std;
int main(int argc, char **argv)
{
    string s1 = "abc";
    s1[1] = toupper(s1[1]);
    cout << s1 << endl; // aBc
    return 0;
}

遍历字符串字符

C++对于字符串的遍历支持迭代器模式

//example9.cpp
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main(int argc, char **argv)
{
    string s1 = "abc";
    for (char &ch : s1)
    {
        cout << ch << endl; // abc
        ch = toupper(ch);
    }
    cout << s1 << endl; // ABC
    //当然我们可以使用auto
    for (auto ch : s1)
    {
        cout << ch << endl; // ABC
        ch = tolower(ch);
    }
    cout << s1 << endl; // ABC
    //可见auto是类型char而不是char&
    return 0;
}

下标的随机访问

//example10.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
    string s1 = "abcd";
    //例如访问最后一个字符
    if (s1.empty() == false)
    {
        cout << s1[s1.size() - 1] << endl; // d
    }
    //字符下标索引从0开始
    // a b c d
    // 0 1 2 3
    return 0;
}

标准库类型vector

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:11:57  更:2022-04-24 09:13:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:45:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码