using namespace std; //使用std命名空间中的名字;
using std::cin
; 使用等号“=”的是拷贝初始化
使用括号的是直接初始化
string s1; //默认初始化,空字符串
string s2(s1);
string s2 = s1; // 二者等价,s2是s1的副本
string s3 = "value";
string s3("value"); //二者等价,是字面值的副本
string s4(n, 'c');
s.size()
的返回类型为string::size_type
(可以等同于 unsigned int);
字符串字面值和string不是同种类型;
在头文件cctype中标准库函数处理这部分工作。
C++标准库兼容C的标准库,C的头文件形如name.h
, C++的则是cname
,且其中的名字隶属于命名空间std;
for(auto c : str) cout << c << endl;
逐个输出字符string::size_type
, 其范围为 0∼(size−1) 0 ∼ ( s i z e − 1 ) ;for (string::size_type i = 0; i < str.size();str[i++] = 'Y'); //机智的写法;
#include
using std::vector;
// 尖括号 <>中即提供的信息
vector<int> ivec;
vector Svector;
vector<vector > file; //元素为vector对象
最常见的方式是先定义一个空的向量vector,然后逐个添加获取的元素;
//列表初始化:
vector v1 = {"a", "red", "apple"};
vector v2{"a", "red", "apple"};
//指定长度vector
vector<int> ivec(10, 0)
先定义一个空vector,再利用其成员函数push_back()
逐个向其中添加元素,例:
vector<int> v1;
for(int i=0;i<100;i++)
v1.push_back(i);
// v1中含有0-99共100个元素;
vector::size_type
;- 支持迭代器的类型拥有begin和end成员,用于返回迭代器;
auto b = v.begin(); //指向第一个元素
auto e = v.end(); //指向尾元素的下一个位置
string s("Hello");
for(auto i = s.begin(); i!= s.end(); ++i)
*i = toupper(*i);
//在for循环中使用了 !=, 而非 < , 因为在C++中,所有的标准库容器迭代器都定义了 ==和!=,而未必有<;
iterator
或const_iterator
, 例:vector<int>::iterator it1; //可读写
vector<int>::const_iterator it2; //只可读,不可写;
*iter
是解引用运算符。 iter->mem
则将解引用和成员访问结合在一起;push_back()
),都会使其迭代器失效;int a[3] = {1, 2, 3};
int a[3] = {};
char str[6] = "Hello";
int *ptr[10]; //含有10个指针的数组;
int &refs[10]; //wrong, 不存在引用的数组
int (*Parray)[10] = &arr; //指向含有10个整数数组的指针;
int (&arrRef)[10] = arr; // 引用含有10个整数的数组
//理解数组的证明,需要从内到外,而不再是从右往左;
size_t
, 定义在头文件
中, 可以直接由C++定义;string str[] = {"a", "an", "the"};
string *p1 = &str[0];
string *p2 = str; //p1 和 p2是等价的
string *pe = &str[3]; //获取的是尾后指针;
int a[] = {0,1,2,3,4,5,6,7,8,9};
int *Pbegin = begin(a);
int *Pend = end(b);
ptrdiff_t
类型,是带符号数, 定义在
中;int a[] = {0,1,2,3,4,5,6,7,8,9};
int i1 = a[1];
int *p = a;
int i2 = *(p+1); //i1和i2是等效的;
//指针执行下标运算:
int *p2 = &a[5];
int i3 = p2[1]; //即 a[6];
int i4 = p2[-1]; //即 a[4]