我读C++ Primer - string vector 与数组

在第二章主要介绍了C++ 的内置类型,除此之外,还有许多标准库中的类型也经常用到,这里这要讲string vector,以及数组。

string表示可变长的字符序列,vector表示某种给定类型的可变长序列,他们都是标准库类型。

头文件中不应该包含using声明,防止与包含此头文件的文件中有命名冲突。


1 标准库类型 string

包含头文件:

#include <string>
using std::string;
(1) 定义与初始化

默认初始化为空的string

string s1;
string s2(s1);
string s2 = s1;
string s3("value");
string s4(n,'c');

(2) 操作string

os<<s
is>>s
getline(is,s)
s.empty()
s.size()
s[n]
s1 + s2
s1 = s2
s1 == s2
< <= > >=
其中,读取一整行 getline(cin, s)  

size() 函数返回的是size_type类型,无符号,注意避免与int 混用

字面值与string 对象相加减,必须保证+ 的两侧至少一个是string

(3) 处理string中字符

isalnum(c)  //判断字母或数字
isalpha(c)  //字母
iscntrl(c)  //控制字符
isdigit(c)  //数字
isgraph(c)  //不是空格但可打印
islower(c)  //小写字母
isprint(c)  //可打印(空格或可视形式)
ispunct(c)  //标点符号
isspace(c)  //空白
isupper(c)  //大写字母
isxdigit(c) //十六进制数字
tolower(c)  //输出小写字母
toupper(c)  //输出大写字母

输出string中每个对象

string str("some string");
for (auto c : str)
    cout<<c<<endl;
若要改变字符串中字符,用引用

string str("some string");
for (auto &c : str)
    c = toupper(c);
    cout<<str<<endl;


2 标准库类型vector

#include<vector>
using std::vector;
(1)定义和初始化vector

最常用的形式是定义一个空vector 然后在添加元素值

vector<T> v1
vector<T> v2(v1)
vector<T> v2 = v1
vector<T> v3(n,val)
vector<T> v4(n)
vector<T> v5{a,b,c...}
(2) 添加元素

向vector 添加元素使用的如此频繁,以至于拿出来单独介绍

vector<int> v;
for(int i = 0; i < 100; ++i)
    v.push_back(i);
不过要注意的是for循环中不应该改变vector的大小

(3) 其他操作

v.empty()
v.size()
v[n]
v1 = v2
v1 = {a,b,c...}
v1 == v2
< <= > >=
对vector进行存取可以使用下标或者迭代器,要注意的是使用下标要检查元素是否存在,不能用下标来添加元素


(3) 迭代器

所有标准库容器都可以使用迭代器来遍历容器中元素。

这里列举一个使用迭代器运算实现的二分搜索:

// text 有序
// sought 是要找的元素
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg) / 2;

while (mid != end && *mid != sought)
{
    if (sought < *mid)
        end = mid;
    else
        beg = mid + 1;
    
    mid = beg + (end - beg) / 2;
}


4 数组

数组也是存放相同类型对象的容器,与vector 不同的是,数组的大小确定不变,不能随意添加元素

(1) 定义和初始化数组

数组的声明形式 a[d] a是数组名字,d是数组维度,也即元素个数。维度必须是一个常量表达式

int a[10];
const int num = 10;
int b[num] = {0,1,2};
char c[] = {'c','+','+'};
char c2[] = "C++";

注意,默认数组初始化为0,最后一种用字面值初始化数组会自动添加‘\0’
对于某些复杂数组的声明(如数组指针,指针数组),最好按照从数组名字由内向外的顺序阅读
(2) 访问数组元素

使用下标方式,注意检查是否越界

(3) 指针与数组

使用数组的时候,编译器一般会把数组名字转换成指向数组首元素的指针

对数组元素取地址能得到指向该元素的指针:

string nums[] = {"one","two"};
string *p = &nums[0];
因为指针操作接近底层,所以容易引发一些与烦琐细节有关的错误,导致使用指针与数组容易出错。

因此C++程序应尽量使用vector和迭代器,避免使用内置数组和指针;尽量使用string,避免使用C风格的基于数组的字符串。

(4) 多维数组

多维数组就是数组的数组。

int a[3][4];
int b[10][20][30] = {0};
int c[3][4] = {
    {0,1,2,3},
    {4,5,6,7},
    {8,9,10,11}
};
操作多维数组也是使用下标,如:

for (auto &row : a)
{
    for (auto &col : row)
    {
        col = 1;
    }
}
由多维数组名得来的指针实际上是指向第一个内层数组的指针



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值