C++ Primer学习笔记:string、vector、迭代器以及数组,只记录不会或不熟悉的地方
命名空间
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