天天看点

c++字符串、向量和数组

前一段时间忙着赶项目进度,现在就接着之前学习的内容继续学习。

1、c++的内置类型(数字和字符等),体现了大多数计算机硬件本身具备的能力。

2、位于头文件中的代码一般不用using进行声明,因为头文件的内容会拷贝到所有引用它的文件中去。

3、关于直接初始化和拷贝初始化:

        拷贝初始化:使用等号进行初始化即为拷贝初始化,例如:string s5 = "everyone can be a better man ";

        直接初始化:不使用等号进行初始化即为直接初始化,例如:string s5("everyone can be a better man");

        建议使用的时候尽量使用直接初始化,因为拷贝初始化会创建一个临时对象。

4、使用cin>>对string对象执行读取操作时,会自动忽略遇到的空白(空格符、换行符、制表符)并从第一个真正的的字符开始读起,直到遇见下一处空白。: 

//example 
 int main()
{
       string s;
       cin>>s;
       cout << s << endl  ;//如果程序输入的是"hello word!"输出为"hello"
      return 0;
}
           

5、使用getline读取输入:getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读取内容直到遇到换行符为止。

int main()
{
   string line;
   while (getline(cin,line))
      cout << line << endl;
   return 0;
}
           

6、string::size_type类型:string对象包含的字符个数,他是一个无符号类型的值能够存放下任何string对象的大小。

7、如果一条表达式中已经有在用.size()函数了,就不要使用int了。避免混用int和unsigned。

8、关于两个string对象的对比:

  1.   如果两个string对象的长度不同,而且较短的string对象的每个字符都与较长string对象对应位置的字符相同,那么就说较短的string对象小于较长的对象。
  2. 如果两个string对象对应位置的字符都不相同,则比较第一对相异字符。             

9、当把string对象和字符字面值混在一条语句中使用时,要确保+号的两边至少有一个是string对象。

10、cctypet头文件中用来处理string对象的方法:

c++字符串、向量和数组

11、c++在引用c中的头文件时将.h去掉,再在前面加上c。例如:ctype.h->cctype。

12、使用范围for循环可以遍历string对象中的每一个元素。如果想改变string中的元素要把循环变量定义成引用类型。

//example
string str("some string");
for (auto c:str)
   cout << c << endl;
           

13、string对象可以使用下标运算符遍历其中的每一个元素[i],使用时务必确保下标的有效。

//使用下标遍历string对象中元素
string s("everyone can be a better one");
for(int i =0;i<(s.size()-1);i++)
{
   cout << s[i];//可以实现输出string中的每一个元素
}
           

14、vector可以容纳绝大多数类型的对象作为其元素,但是不能为引用(引用不是对象没有分配内存)

15、c++提供的几种初始化方式:

            (1)、拷贝初始化;(2)、类内初始化;(3)、列表初始化。

16、如果循环体内有向vector对象添加元素的语句,不能使用范围for循环。

17、要使用vector的size_type,需首先定义它是由那种类型定义的。

//example
vector <int>::size_type;
           

18、有关数组:

               (1)数组的维数编译的时候应该是一个常数,函数内部定义数组默认初始化会使他含有未定义的值。

               (2)初始化字符数组要考虑最有一个是'\0'

               (3)数组不支持用另外一个数组拷贝和赋值

//关于复杂数组的声明(从右向左结合)
int *ptrs[10];//一个包含10个整形指针的数组
int &refs[10];//错误:不存在包含引用的数组(因为引用不是对象)
int (*parray)[10]; //指向数组的指针
int (&refs)[10];//指向数组的引用
           

19、使用auto和decltype对数组操作返回的对象不同。

int ia [] = {3,3,3,3,33};
auto ia2(ia) ; //返回指向第一个元素的指针
decltype(ia) ia3;//返回一个数组
           

20、数组的begin和end(基于c++11标准)

//基于c++11
int ia [] = {2,2,2,2,2};
int *beg = begin(ia);
int * end = end(ia);
           

21、只要指针指向数组中的元素就可以执行下标运算访问元素,内置类型下标运算所用的索引值不是无符号类型的。

22、c风格字符串以'\0'结尾,使用数组时真正用的是指向数组首元素的的指针。

23、指针没有定义加法运算,减法限于指向同一个数组

24、可以使用数组初始化vector

int int_arr[]={2,3,4,5,6,7};
vector<int>ivec(begin(int_arr),end(int_arr));
           

25、多维数组:

constexpr size_t rowCnt = 3, colCnt =4;
int ia[rowCnt][colCnt];
size_t cnt =0;
for (auto &row:ia)
    for(auto & col:row)
       {
           col = cnt;
           ++cnt;
       }
//使用范围for循环处理多维数组时,除了最内层的循环外,替他循环的控制变量都应该是引用类型
           

26、缓冲区溢出:越界访问引起的错误。

继续阅读