【C++ Primer Chapter 3 总结】Library vector & string Type

1.A vector is a class template, a string is class. 模板(template)本身不是函数/类,但是可以指导编译器生成函数/类,该过程叫做实例化(instantiation)。
//常用初始化方法
vector<T> V(n, val);
vector<T> V = {val1, val2, val3};
vector<T> V = V2;
vector<vector<T>> V(n, vector<T>(m, val)); 
 
2.vector有下标符[],但是该符号只能访问已经存在的元素!vector使用push_back()添加新元素!
//常用操作
V.empty();
V.size();
V.push_back();
V.pop_back();
V.emplace_back();       //c++11新特性,会自动调用构造函数
V.begin();            //返回第一个元素的迭代器
V.rbegin();           //返回最后一个元素的迭代器 reverse的begin()
V.end();              //返回最后一个元素后一个位置的迭代器
V.rend();             //返回第一个元素前一个位置的迭代器 reverse的end()
V.cbegin();          //const_iterator,指向const元素,不能用于修改迭代器指向的元素
V.cend();            //const_iterator
V.crbegin();         //const_iterator
V.crend();          //const_iterator
V[index]             //  vector的下标操作符只能访问存在的变量,不能添加元素,区别于map容器
V1 == V2 
 
3.所有容器(container)都有迭代器(iterator)。我们不关心迭代器的类型,可以是容器的成员函数begin()返回的类型。
auto b = C.begin();             //begin()指向容器的第一个元素,如果容器为空,C.begin()==C.end()
auto e = C.end();               //end()指向容器最后一个元素的下一个位置,off-the-end,标志着我们处理完了容器中所有的元素,注意这里C.end()位置是不存在的元素,是不可访问的!

 

4.iterator和const_iterator。const_iterator类似于const pointer,对于const_iterator表示的元素只读不可写,即不可通过迭代器改变元素的值。
const_iterator可以指向const元素和非const元素,但是iterator不能指向const元素。
vector<int> V;
const vector<int> CV;
auto it1 = V.begin();
auto it2 = CV.begin();        //相当于 const vector<int> const_iterator it2 = CV.cbegin(); 
 
5.Array数组数据结构。
char a[6] = "hello";                //string类型初始化字符数组,不用显示添加'\0',因为string字符以'\0'结尾,复制时会一起被复制到字符数组中
char a[6] = {'h','e','l','l','o','\0'};   
cout << sizeof(a) / sizeof(*a) << endl;    //数组长度
 
6.理解复杂数组的声明。从右到左,从内到外读。
int *ptrs[10];               //ptsr是大小为10的数组(ptrs[10]),数组元素是指向int的指针(int*)
int &refs[10] = /* ? */;         //error:因为没有引用数组。因为数组元素是object,引用不是一个具体的object,只是object的别名
int (*parray)[10] = &arr;        //parray是指针(*parry),指向大小为10的数组([10]),数组元素是int
int(&arrRef)[10] = arr;          //arrRef是引用(&arrRef),引用的是大小为10的数组([10]),数组元素是int
int *(&arry)[10] = ptrs;         //10个指针的数组的引用:arry是引用(&arry),引用的是大小为10的数组([10]),数组元素是指向int的指针(int*)

 

7.数组的特殊属性。在大多数情况使用数组的时候,编译器会自动使用指向数组第一个元素的指针替代数组类型。
使用auto定义的变量推断出来的类型是指针,使用decltype推断出来的类型是数组。
string nums[] = {"one", "two", "three"};
string *p = nums;
 
int ia[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
auto ia2(ia);                             // ia2是int*类型
*(ia2 + 4) = 42;
 
decltype(ia) ia3 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};      // ia3是数组类型
ia3[4] = 42;  
 
8.同容器成员函数begin()和end()一样,取数组的首位置和位置后一个位置的函数。可以用数组初始化vector。
#include <iterator>
int a[] = {1,2,3,4,5};
int *b = begin(a), *e = end(a);
vector<int> v(begin(a), end(a));
 
9.string初始化
string s1;
string s2(s1);
string s3("value");
string s3 = "value";
string s4(n, 'c');            // s4初始化为n个c字符
 
10.读取未知数量的字符串
string word;
while(cin >> word) {}          // 以空格/换行为分隔符从输入流中读取字符串,直到end-of-file。cin返回istream&
 
string line;
while(getline(cin, line)) {}     // 以换行符为分隔符从输入流中读取字符串,直到end-of-file。getline()返回istream&. 注意getline会读取流中的换行符,但是不会保存到string变量中。
 
11.C-Style Charater Strings。C风格字符串。以空字符结束('\0')。
#include <cstring>
char a[] = "hello", b[] = "C++";
strlen(a);
strcmp(a, b);
strcpy(a, b);
strcat(a, b);
 
12.在任何可以使用字符串字面值(string literal)的地方都可以用空字符结束的字符数组代替。反之不成立:如果程序的某处需要一个C风格字符串,无法直接用string对象来代替。
string s = "hello";
char *str = s; //error:不能用string对象初始化char*
const char *str = s.c_str();  //将string对象转成C类型字符串

  

13.string::size()成员函数返回类型是string::size_type类型,是一个无符号类型(unsigned type)。当表达式中包含string::size()和int类型的时候,int类型负数会被转换为一个很大的unsigned值。 sizeof(string::size_type) = 8
 
14.C++11数字类型转string。string转C类型字符串。C类型字符串转数字类型。
string s = to_string(num);
char * cs;
strcpy(cs, s.c_str());
int a = atoi(cs);
 
15.字符串流stringstream实现字符串和其他类型的转换。
string data = "1 2 3 4";
istringstream is(data);
int a, sum = 0;
while(is >> a){
    sum += a;
}
cout << sum << endl;   // 10
 
16.cctype头文件中对字符进行操作的函数。
isalnum(c)         // letter or digit
isalpha(c)         // letter
isdigit(c)         // digit
islower(c)   
isupper(c)
 
tolower(c)
toupper(c)
 
17.string拷贝构造函数。
string s(pointer_to_string, num);
string s(src, pos);
string s(src, pos, len);
 
string s = "hello";
string t(s, 2);            // t = "he"
string t(s, 0);            // t = "hello"
string t(s, 0, s.size());     // t= "hello"
 
18.string子串。
string s = "hello;
str = s.substr(pos, len);       // 起始位置,长度
 
19.string修改操作。
s.erase(pos, len);
s.assign(args);             // 将原字符串替换为参数内容 
s.append(args);            // 在字符串后追加参数内容
args: str / str, pos, len /  begin, end / num, character_c
 
20.string查找操作。
s.find(args);    // 第一次出现的位置
s.rfind(args);   // 最后一次出现的位置
args: c, pos / str, pos   // 字符c或字符串str在string s中从pos开始出现的位置

  

 
 
 
 
posted @ 2021-05-29 17:24  萌新的学习之路  阅读(67)  评论(0编辑  收藏  举报