头文件不应该包含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
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类型及其伴随类...