C++ Primer 学习笔记_15_新旧代码兼容与多维数组

新旧代码兼容与多维数组



一、新旧代码兼容

1、可以使用C风格字符串对string对象进行初始化或赋值

	const char *str = "hello World";
	string Str(str);

2、然而,在使用C风格字符串的地方不能直接使用string对象

	const char *tmp = Str;		//ERROR

string对象提供了一个名为c_str()的成员函数,该函数返回constchar类型的数组

	const char *tmp = Str.c_str();

但是接下来对Str的操作会影响到tmp的取值,如:

	const char *str = "Hello World";
	string Str(str);
	const char *tmp = Str.c_str();
	cout << tmp << endl;
	Str = "Hello";
	cout << tmp << endl;
	char *tmp = new char[Str.size() + 1];
	strncpy(tmp,Str.c_str(),Str.size() + 1);

因此,如果程序需要持续访问该数据,则应该复制c_str()函数的返回值的数组。


3、使用数组初始化vector对象

使用数组初始化vector对象,必须指出由于初始化式的第一个元素以及数组最后一个元素最后一个元素的下一位置的地址:

	const size_t arr_sz = 6;
	int arr[arr_sz] = {0,1,2,3,4,5};
	vector<int> ivec(arr,arr+arr_sz);
	vector<int> ivec1(arr + 1,arr + arr_sz-1);

//P122 习题4.31
int main()
{
	char str[10];
	string value;
	cin >> value;
	strcpy(str,value.c_str());
	cout << str << endl;
}

//优化
int main()
{
	string value;
	while (cin >> value)
	{
		char *str = new char[value.size() + 1];
		strncpy(str,value.c_str(),value.size() + 1);
		cout << str << endl;
		delete []str;//千万不要忘记释放堆内存
	}
}

//习题4.32
int main()
{
	freopen("input.txt","r",stdin);
	vector<int> ivec;
	int value;
	while (cin >> value)
	{
		ivec.push_back(value);
	}

	int *arr = new int[ivec.size()];
	for (size_t index = 0;index != ivec.size(); ++index)
	{
		arr[index] = ivec[index];
		cout << arr[index] << ‘ ‘;
	}
	cout << endl;
	delete []arr;	//千万不要忘记释放堆内存
}

二、多维数组

    通常,所指的多维数组就是数组的数组!

   C++中,并未限制可用的下标个数,也就是说,我们可以定义元素是数组(其元素又是数组,如此类推)的数组!

1、多维数组初始化

 int arr[3][4] =
    {
        {0,1,2,3},
        {4,5,6,7},
        {8,9,0,11}
    };

    1)下面的语句只初始化了每行的第一个元素

    int ia[3][4] = {{1},{2},{3}};

    2)下面的语句只初始化了第一行的所有元素

    int ia[3][4] = {1,2,3,4};

2、多维数组的下标引用

    行下标指出需要哪个内部数组,列下标则选取该内部数组的指定元素。

    const size_t rowSize = 3;
    const size_t colSize = 4;
    int ia [rowSize][colSize];

    for (size_t i = 0; i != rowSize; ++i)
    {
        for (size_t j = 0; j != colSize; ++j)
        {
            ia [i][j] = i * colSize + j;
            cout << ia[i][j] << ‘ ‘;
        }
        cout << endl;
    }

3、指针与多维数组

    与普通数组一样,使用多维数组名时,将自动转换为指向概述组第一个元素的指针。但是要注意:多维数组转换而成的指针类型应该是指向第一内层数组的指针!

	//可以理解为*p是int[colSize]类型!
    int (*p)[colSize] = ia;
    p = &ia[2];

下面的声明圆括号是必不可少的:

   int *p[4];   //指针数组	array of pointers to int.
   int (*p)[4]; //数组指针	pointer to an array of 4 ints.

    typedef int int_arr[4];
    for (int_arr *p = ia; p != ia + rowSize; ++p)
    {
        for (int *q = *p; q != *p + colSize; ++q)
        {
            cout << *q << ‘ ‘;
        }
        cout << endl;
    }

//P124 习题4.36
int main()
{
    const size_t rowSize = 3;
    const size_t colSize = 4;
    int ia [rowSize][colSize];

    for (size_t i = 0; i != rowSize; ++i)
    {
        for (size_t j = 0; j != colSize; ++j)
        {
            ia [i][j] = i * colSize + j;
        }
    }

    for (int (*p)[colSize] = ia;p != ia + rowSize; ++p)
    {
        for (int *q = *p; q != *p + colSize; ++q)
            cout << *q << ‘ ‘;
        cout << endl;
    }
}

C++ Primer 学习笔记_15_新旧代码兼容与多维数组,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。