首页 > 其他分享 >字符串、向量和数组

字符串、向量和数组

时间:2022-09-06 10:57:13浏览次数:87  
标签:10 string 迭代 int vector 数组 字符串 向量

C++ Primer学习笔记:string、vector、迭代器以及数组,只记录不会或不熟悉的地方

博客小站:blog.smartdog.top

命名空间

std::cin

使用标准输入输出命名空间,:: 域操作符表示:编译器应从操作符左侧名字所示的作用域中寻找右侧那个名字。

使用 using 可以引入某个命名空间中的成员,再使用时不需要写命名空间:

// using namespace::name;
using std::cin;
// 后面省略命名空间,直接写 cin>>a;

头文件中一般来说不应该包含using声明,因为头文件会被拷贝到引用它的文件中,造成命名冲突。

string

初始化

#include <string>
using std::string;

string s1;
string s2 = s1;  // 等价 string s2(s1)
string s3 = "hello";  // 等价 string s3("hello")
string s4(10,'c');  // s4内容是10个c

使用等号是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。不使用等号,像 s4,执行的是直接初始化。

s4的形式可以写成 string s4 = string(10,'c');,等价于string temp(10,'c'); string s4 = temp;,并没有任何补偿优势。

操作

os<<s;
is>>s;
getline(is,s); // 从is中读取一行赋值给s,返回is,用来保留输入时的空白符
s.empty();
s.size();  // 字符个数
s[n];
s1 + s2;
s1 = s2;
s1 == s2;   // string对象的相等性判断对字母大小写敏感
s1 != s2;
<, <=, >, >=;  //字典序比较

string::size_type 类型

string.size() 函数返回的是一个 string::size_type 类型的值。

string 类及其他大多数标准类型都定义了几种配套的类型。这些配套类型体现了标准库类型与机器无关的特性,类型 size_type 即是其中的一种。在具体使用的时候,通过作用域操作符来表明名字 size_type 是在类 string 中定义的。

因为 size 函数返回的是一个无符号整数,所以不要让 size() 函数和 int 在一个表达式中,避免混用 int 和 unsigned 可能带来的问题。

字面值和string对象相加

需要确保 加法运算符了两侧至少一个是 string:

string s4 = s1 + ", "; // 对
string s5 = "hello" + " ,"; // 错
string s6 = s1 + ", " + "world"; // 错
string s7 = "hello" + ", " + s1; // 错

因为某些历史原因,也为了与C兼容,所以C++语言中的字符串字面值并不是标准库类型string的对象。

处理string对象中的字符

cctype头文件中定义了一组标准库函数。

#include "cctype";

isalnum(c); // 字母或数字
isalpha(c); // 字母
iscntrl(c); // 控制字符
isdigit(c); // 数字
isgraph(c); // 不是空格但可打印
islower(c); // 小写字母
isprint(c); // 可打印字符
ispunct(c); // 标点符号
isspace(c); // 空白(控制、横向纵向制表符、回车符、换行符、进纸符
isupper(c); // 大写字母
isxdigit(c); // 十六进制数字
tolower(c); // to小写字母
toupper(c); // to大写字母

for循环改变字符串中的字符

string s("Hello world!!!");
for(auto &c : s){ // 如果要改变,需要是引用
    c = toupper(c);
}
cout<< s <<endl;

vector

使用:

#include <vector>
using std::vector;

vector 是一个类模板:

vector<int> ivec;
vector<Sales_item> sales_vec;
vector<vector<string> > file; // C++11 后尖括号之间的空格可省略

定义和初始化

vector<T> v1;
vector<T> v2(v1);  // 包含v1所有元素的副本
vector<T> v2 = v1;  // 同上
vector<T> v3(n,val);  // n个重复元素val
vector<T> v4(n);  // n个执行了初始化的对象
vector<T> v4{n};  // 同上
vector<T> v5{a,b,c...};  // 列表初始化
vector<T> v5={a,b,c...};

操作

v.empty();
v.size();  // 类型: vector<int>::size_type
v.push_back(t);
v[n];
v1 = v2;
v1 = {a,b,c...}; // 用列表中的元素的拷贝替换v1中的元素
v1 == v2;
v1 != v2;
<, <=, >, >=;  // 字典序

可以使用 for each 方法遍历 vector 中的元素。

迭代器

有迭代器的类型会有 begin 和 end 的成员,begin 和 end 分别返回第一个和最后一个元素下一个位置的迭代器。

auto b = v.begin(),e = v.end();

如果容器为空,bengin 和 end 都返回同一个迭代器,尾后迭代器。

操作

*iter;  // 返回迭代器所指元素的引用
iter->mem; 
++iter;  // 指向下一个,尾后迭代器不能进行递增或解引用操作
--iter;  // 指向上一个
==,!=;

迭代器类型:

一般来说是不需要知道迭代器的类型的,只要用auto。

vector<int>::iterator it;
string::iterator it2;

vector<int>::const_iterator it3;  // 只能读,不能写,如果元素是常量,只能用这个
string::const_iterator it4; 

如果对象是常量,返回 const_iterator ,如果不是常量,返回 iterator ; 如果只想获取 const_iterator,C++11引入了两个新函数:cbegin / cend。

运算

iter + n;  // 向后移动n位
iter - n;  // 向前移动n位
iter1 - iter2;  // 计算他们之间的距离,带符号
>, >=, <, <=;  // 判断前后位置

数组

c / c++中数组的元素个数必须是个常量表达式【不像java可以输入一个变量当作数组长度】

可以使用列表初始化,字符数组使用字符串初始化时自动添加 '\0' 表示字符串结束的空字符。

不允许拷贝和赋值,int a2[] = a; a2 = a 都是错的。

一些编译器支持数组的赋值,这就是所谓的编译器扩展,但是一般来说,最好避免使用非标准的特性,因为可能在其他编译器上无法正常工作。

数组和指针

int *ptrs[10];					// 含有10个整形指针的数组
int &refs[10] = /* ... */;		// 错误:不存在引用的数组
int (*Parray)[10] = &arr;		// Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr;		// arrRef引用一个含有10个整数的数组

// 从右向左,从内向外理解数组声明的含义
int *(&arry)[10] = ptrs;		// arry是数组的引用,该数组含有10个指针

使用数组的时候编译器一般会把它转换成指针。这里隐含着当使用数组作为一个 auto 变量的初始值时,推断得到的类型是指针而非数组。但是使用 decltype 关键字不会发生这种转换,返回的类型还是数组。

操作

C++11 新标准引入了两个名为 begin 和 end 的函数,可以获得首元素指针和尾后指针,从而遍历数组。用法和迭代器相同。

数组中方括号里的索引可以是负数,迭代器虽然可以使用相同的形式访问元素,但是只能是无符号数。

与旧代码的接口

  • 允许使用以空字符结束的字符数组来初始化 string 对象或为 string 对象赋值

  • 在 string 对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个运算对象都是);在 string 对象的复合赋值运算中允许使用以空字符结束的字符数组作为右侧的运算对象。

  • s.c_str() : 返回一个 C 风格的字符串

  • 使用数组初始化 vector 对象

    int int_arr[] = {0,1,2,3,4,5};
    vector<int> ivec(begin(int_arr),end(int_arr));
    

多维数组

初始化时,当为每个元素赋值,可以省略内层嵌套的花括号:

int ia[3][4] = {
    {0,1,2,3},
    {4,5,6,7},
    {8,9,10,11}
};
// 等价
int ia[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

// 显示初始化每一行的首元素
int ia[3][4] = {{0},{4},{8}};

for each遍历的时候除了最内层的循环,其他所有循环都要使用引用,防止 auto 把数组转成指针。

标签:10,string,迭代,int,vector,数组,字符串,向量
From: https://www.cnblogs.com/heymeteor/p/string_vector_array.html

相关文章

  • C++字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)
    1、C/C++:longint与longlong的区别在实际的使用中,long与int几乎没有区别:原因是早期的C编译器定义了longint占用4个字节,int占用2个字节,longint是名副其实的长整型。在AN......
  • 使用支持向量机识别手写数字。
    使用支持向量机识别手写数字。根据使用支持向量机识别手写数字的问题,一些科学家声称它可以准确地预测95%的时间。我必须进行数据分析才能接受或拒绝这个假设。我已经做......
  • LeetCode 问题之禅:第 92 天——数字和字符串
    LeetCode问题之禅:第92天——数字和字符串欢迎回到LeetCode日常练习系列.今天我做了2简单问题。让我们开始!Photoby迈克豪普特on不飞溅将整数转换为两个......
  • 9月5日——静态方法、数组拷贝、大数值
    带标签的break、continuepublicclassLabeledFor{publicstaticvoidmain(String[]args){inti=0;outer://Can'thavestatementsherefor(;......
  • 二维数组
    二维数组目录二维数组定义二维数组打印一维数组中某一二维数组的元素遍历并打印二维数组定义二维数组二维数组就是在一维数组的嵌套了一层的数组元素,这些元素既是一维......
  • get请求传对象数组参数
    有个请求,里面的参数有对象数组的情况,原来是post请求,后面接口改成get请求,那用axios请求的参数自然也从data改为params。第一次修改后的请求情况是这样的:整个路径......
  • 977 有序数组的平方
    题目977有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输......
  • 字符串入门学习笔记
    字符串哈希idea将字符串映射成一个数值(称为哈希值),因此可以在O(1)时间内做到例如判断两个串是否相等这样的事情,优化了时间复杂度注意,哈希值不同时字符串一定不同;哈希值相......
  • R语言中当order有两个向量参数时的排序规则
     001、order(c(1,1,1,2,2,2,3,3,3),c(7,5,2,1,4,8,9,3,6))##首先对最小的三个参数排序,也就是对7、5、2进行排序,结果为3,2,1##然后对1、4、8进行排序及1、......
  • Python 如何将字符串转为字典
    实习工作中需要将每行读取的字符串例如'{"A":"sad","B":"123"}'这种形式中的123取出来,查找到了这篇文章,对我很有帮助。转载一下防止遗失。将一个 python 的字符串转为......