0
点赞
收藏
分享

微信扫一扫

cppPrimer第三章习题

诗与泡面 2022-02-21 阅读 95
c++

3.3 请说明string类的输入运算符和getline函数分别是如何处理空白字符的

  1. string类输入运算符会忽略开头的空白(空格符、换行符、制表符等),从第一个真正的字符开始读起,直到遇见下一处空白为止。
  2. getline(istream& is, string str)函数会保留在一行中输入的空白符。getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止。

3.12 判断下列vector对象定义有不正确的吗?如果有,请指出来。对于正确的,描述其执行结果,对于不正确的,说明其错误原因。

vector<vector<int>> ivec; // 正确
//vector<string> svec = ivec; //错误ivec类型与vector<string>不一致,不可用于该类型对象的拷贝初始化
vector<string> svec(10, "null");//正确,创建一个vector<string>对象,用10个"null"进行初始化

3.13 下列vector对象各包含多少个元素?这些元素值分别是多少?

vector<int> v1;//0 个元素
vector<int> v2(10); // 10个元素,每个元素被初始化为0
vector<int> v3(10, 42); // 10个元素,每个元素被初始化为42
vector<int> v4{10}; //一个元素,值为10
vector<int> v5{10, 42};// 两个元素,分别为10, 42
vector<string> v6{10}; //编译器检测无法使用列表初始化,则用该值构造对象,故有10个元素,每个元素值均为空string对象
vector<string> v7{10, "hi"}; //10个对象, 每个均为"hi"

3.19 定义一个含有10个元素的vector对象,所有元素值皆为42。请列出三种不同的实现方法。哪种方法更好呢?为什么?

vector<int> v1(10, 42); //推荐,因为简单,用参数来构造对象,元素值是重复的。
vector<int> v2{ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; //列表初始化
vector<int> v3 = {42, 42, 42, 42, 42, 42, 42, 42, 42, 42};
vector<int> v4;
	for (vector<int>::size_type i = 0; i < 10; ++i)
		v3.push_back(42);

3.26 在100页二分搜索程序中为什么用的是 mid = beg + (end-beg) / 2,而不是mid = (beg+end)/2?

因为没有定义两个迭代器相加的运算符,所以迭代器相加无意义。

3.27 假设txt_size是一个无参数的函数,返回值为int。判断下列定义合法性

unsigned buf_size = 1024;
int ia[buf_size]; //不合法,数组维度必须是常量表达式
int ia[4 * 7 - 14];	//合法
int ia[txt_size()];//若txt_size() 为constexpr(常量表达式)则合法
char st[11] = "fundamental";//不合法,字符串字面值还包含一个结尾空字符,需要长度为12的字符数组才可存放

3.29 相比于vector来说,数组有哪些缺点,请列举一些。

  1. 数组长度一旦固定就不可以改变,灵活性不如vector
  2. 不允许使用一个已生成的数组拷贝初始化一个新的数组
  3. 数组长度必须为constexpr类型,而vector只要是unsigned类型即可
  4. 不能把一个数组直接赋给另一个数组

3.36 编写一段程序,比较两个数组是否相等

//比较两个数组是否相等
int arr1[] = { 1, 2, 3 };
int arr2[] = { 1, 2, 3 };

int* p1 = std::begin(arr1), * p2 = std::begin(arr2);
for(; p1 != std::end(arr1) && p2 != std::end(arr2);++p1,++p2)
    if (*p1 != *p2)
    {
        cout << "Not equal!" << endl;
        return;
    }

//若有一个指针还未到最后一个指针的下一个位置,说明两个指针不等长,则不等
if (p1 != std::end(arr1) || p2 != std::end(arr2))
{
    std::cout << "Not equal!" << endl;
    return;
}

cout << "Equal!" << endl;

3.38 两个指针相加是否有意义?

因为两个指针相加后得到的是一个未知的地址,对其进行操作必然是没有任何意义的

举报

相关推荐

0 条评论