C 11学习笔记 2

发布 2022-06-17 16:13:28 阅读 8406

头文件不应该包含using声明,防止名字冲突。

string 定义在命名空间std中。

初始化string对象方式:

string s1;

string s2(s1);

string s2=s1;

string s3("value");

string s3="value";

string s4(n,'c') s4初始化成由n个字符c组成的串。

用等号执行的是拷贝初始化,不用等号是直接初始化。

string s8=string(10,'c');通过创建临时对象来实现拷贝初始化。

string的操作:

os>s;

getline(is,s);/从is中读取一行赋给s,返回is,直到遇到换行符为止,注意不存换行符。

//返回值为string::size_type,可通过auto和decltype来推断,该类型是无符号型。

s[n];s1+s2;

s1=s2;

s1==s2;

s1!=s2;,<

string s2=s1+",对。

string s3="hello"+"错。

cctype头文件中的函数:

isalnum(c) 当c是字母或数字时为真。

isalpha(c) 当c是字母是为真。

iscntrl(c) 当c是控制字符时为真。

isdigit(c) 当c是数字时为真。

isgraph(c) 当c不是空格但可打印是为真。

islower(c) 当c是小写字母时为真。

isprint(c) 当c是可打印字符时为真,即c是空格或c具有可视形式。

ispunct(c) 当c是标点符号是为真。

isspace(c) 当c是空白时为真。

isupper(c) 当c是大写字母时为真。

isxdigit(c) 当c是十六进制数字时为真。

tolower(c) 如果c是大写字母,输出对应的小写字母,否则原样输出c

toupper(c) 如果c是小写字母,输出对应的大写字母,否则原样输出c

string str("some string");

for(auto c:str)

cout<< c<如果想要改变string的值那就要声明为引用。

for(auto &c:s)

c= toupper(c);

因为引用不是对象,所以不存在包含引用的vector;

老版c++vector >要有空格,c++11不是必须。

vector初始化方法:

vector v1;

vector v2(v1);

vector v2=v1;

vector v3(n,val) /n个重复的val值。

vector v4(n); n个重复执行了值初始化。

vector v5

vector v5=; 只能放在花括号中。

注意圆括号和花括号的区别。

vector v5; /列表初始化。

vector v6("hi");错,不能使用字符串字面值来构建vector对象。

vector v7; /v7 有10 个默认初始化元素。

vector v8; /v8 有10个“hi”值。

使用花括号是如果不能进行列表初始化,就考虑其他方式。

想vector中添加元素,push_back;

如果所有元素都一样就在初始化时指定vector大小,否则采用自动增长。

如果循环体内部包含想vector对象添加元素,则不能使用for each循环。

for each 语句内部能改变范围的大小。

vector的其他操作:

v[n]v1=v2

v1= /用v2中的元素的拷贝替换v1中的元素。

v1==v2

v1!=v2,<=

要使用size_type,必须明确:vector::size_type, size()返回值。

进行比较是元素必须是可比较的,(有的类没有定义比较,不可用做vector元素);

不能用下标来添加元素,超出size(),只能对已存在的元素使用下标操作。

所谓缓冲区溢出指的就是通过下标访问了不存在的元素,可以尽可能的使用for each

string不是容器,但支持很多容器的操作。

end()返回的是最后一个元素的下一个位置。

如访问begin()时注意检查begin!=end

end不能用解引用,和自增操作。

所有的标准容器都定义了==和!=,大多数都么有定义<

vector::const_iterator 常量迭代器。

cbegain cend 不管对象是不是常量,都返回的是常量迭代器。

*it).empty() 等价于 it->empty()

//错。vector的限制,不能在范围for循环中想vector对象添加元素。

任何一种可能改变vector对象容器的操作,比如push_back,都会使该vector对象的迭代器失效。

切记,,使用了迭代器的循环体,都不要向迭代器所属容器添加元素。

两迭代器相减得到的是,difference_type的带符号整型数,可正可负;

二分搜索。auto beg=

auto mid=

while(mid!=end&& mid !=sought)

if(sought<*mid)

end = mid;

elsebeg=mid + 1;

mid = beg + end -beg)/2;

int *ptrs[10]; 含有10个整型的数组。

int &ptr[10]; 错。

int (*parray)[10] =arr; /parray指向一个含有10个元素的整数的数组。

int (&arrref)[10] =arr; /arrref引用以个含有10个元素的数组。

类型修饰符从右向左依次绑定。

数组的下标通常定义成 size_t 类型,与机器相关的无符号类型,在cstddef头文件中定义。

int ia=

auto ia2(ia); 返回的是指向ia第一个元素的指针。

decltype (ia) ia3=;/decltype(ia) 返回的类型是由3个int构成的数组;

begin(ia) ,end(ia) /c++11新。

auto n=end(arr)-begin(arr),得到的是ptrdiff_t的标准库类型,在cstddef中。

标准库类型限定使用的下标是无符号型,而内置的下标运算无此要求。

在c++中最好不好使用c风格的字符串,有风险。

cstring头文件,strlen(p);

strcmp(p1,p2);/p1>p2返回的是正值。

strcat(p1,p2);/不能缺包 p1足够放下p1+p2,风险。

strcpy(p1,p2);

上述函数不会验证参数,传入的字符数组必须以'/0'结束。

const char *str=

int int_arr[ ]

vector ivec(begin(int_arr),end(int_arr));用数组初始化vector,也可以使数组的一部分,尽量使用标准库类型而非数组。

int (&row)[4]; 含有4个整数的数组的引用。

for(const auto &row : ia)

for(auto col : row)

cout<这个循环中么有写操作,但仍然将外层循环的控制变量声明成了引用,是为了避免数组被自动转换成指针。

要使用for each 语句,对于多维数组,除了最内层循环,其他所有的循环的控制变量都要是引用类型。

可使用auto 和typedef 来简化多维数组的访问。

C11学习笔记 5

参数传递时,如果是引用类型,它将绑定到对应的实参上,否者,将实参的值拷贝后赋给形参。引用可避免拷贝,如果不需要改变参数,最好定义成常量引用。和其他初始化一样,当用实参初始化时会忽略顶层const,当形参有顶层const时,传给它常量对象或非常量对象都可以。我们可以用非常量初始化一个底层const对象...

C 11学习笔记 11

动态分配的内存,只有在显式释放是,这些对象才会销毁。但是标准库中的两智能指针可以确保自动释放。除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。静态内存用来保存局部static对象 类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数没得非stat...

C 11学习笔记 16

tuple是类型pair的模板。不同tuple类型的成员类型也不同,但一个tuple可以有任意数量的成员。每个确定的tuple类型的成员数目是固定的。当我们希望将一些数据组合成单一对象,但有不想麻烦地定义一个新数据结构来表示时,tuple是非常有用的。快速而随意 的数据结构 tuple类型及其伴随类...