《C++ Primer》5th 课后练习 第三章 字符串、向量和数组 21~30

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40758751/article/details/102733524

练习3.21 请使用迭代器重做3.3.3节的第一个练习。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
void check_and_print(vector<int> &vec, int num)
{
    cout << "v" << num << ": "<< vec.capacity() << endl;
    for (auto i = vec.cbegin(); i != vec.cend(); i++)
        cout << *i << " ";
    cout << endl;
}
void check_and_print(vector<string> &vec, int num)
{
    cout << "v" << num << ": " << vec.capacity() << endl;
    for (auto i = vec.cbegin(); i != vec.cend(); i++)
        cout << *i << " ";
    cout << endl;
}
int main()
{
    vector<int> v1;                // size:0,  no values.
    vector<int> v2(10);            // size:10, value:0
    vector<int> v3(10, 42);         // size:10, value:42
    vector<int> v4{ 10 };            // size:1,  value:10
    vector<int> v5{ 10, 42 };         // size:2,  value:10, 42
    vector<string> v6{ 10 };            // size:10, value:""
    vector<string> v7{ 10, "hi" };     // size:10, value:"hi"
    
    check_and_print(v1, 1);
    check_and_print(v2, 2);
    check_and_print(v3, 3);
    check_and_print(v4, 4);
    check_and_print(v5, 5);
    check_and_print(v6, 6);
    check_and_print(v7, 7);
    return 0;
}

之前犯蠢了,原来是让用迭代器重做94页最后一个练习

#include<vector>
#include<iostream>
using namespace std;
int main()
{
    int temp;
    vector<int> vec;
    while (cin >> temp) {
        vec.push_back(temp);
    }
    for (auto iter = vec.begin() + 1; iter < vec.end(); ++iter) {
        cout << *(iter - 1) + *iter << " ";
    }
    cout << endl;
    return 0;
}
#include<vector>
#include<iostream>
using namespace std;
int main()
{
    int temp;
    vector<int> vec;
    while (cin >> temp) {
        vec.push_back(temp);
    }
    for (auto iter = vec.begin(); iter < vec.end(); ++iter) {
        cout << *(vec.end() - iter + vec.begin() - 1) + *iter << " ";
    }
    cout << endl;
    return 0;
}

练习3.22 修改之前那个输出text第一段的程序,首先把text的第一段全部改成大写形式,然后输出它。

#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;

int main()
{
    vector<string> text;
    text.push_back("aaaaaaaaaa aaaaaaaaa aaaaaa");
    text.push_back("");
    text.push_back("bbbbbbbbbbbbbb bbbbbbbbbbb bbbbbbbbbbbbb");
    for (auto i = text.begin(); i != text.end() && !i->empty(); i++)
        for (auto &c : *i)
            c = toupper(c);
    for (auto i = text.cbegin(); i != text.end(); i++)
        cout << *i << " ";
    cout << endl;
    return 0;
}

练习3.23 编写一段程序,创建一个含有10个整数的vector对象,然后使用迭代器将所有元素的值都变成原来的两倍。输出vector对象的内容,检验程序是否正确。

#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;

int main()
{
    vector<int> vec(10, 42);
    for (auto i = vec.begin(); i != vec.end(); i++)
    {
        *i = (*i) * 2;
    }
    for (auto i = vec.cbegin(); i != vec.end(); i++)
        cout << *i << " ";
    cout << endl;
    return 0;
}

练习3.24 请使用迭代器重做3.3.3节的最后一个练习。

#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;

int main()
{
    vector<int> vec;
    int temp;
    while (cin >> temp)
    {
        vec.push_back(temp);
    }
    if (vec.begin() != vec.end())
    {
        for (auto i = vec.cbegin(); i != vec.end() - 1; i++)
            cout << *i + *(i + 1) << " ";
    }
    cout << endl;
    return 0;
}
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;

int main()
{
    vector<int> vec;
    int temp;
    while (cin >> temp)
    {
        vec.push_back(temp);
    }
    if (vec.begin() != vec.end())
    {
        for (auto i = vec.cbegin(); i != vec.end(); i++)
            cout << *i + *(vec.end() - 1 - (i-vec.begin())) << " ";
    }
    cout << endl;
    return 0;
}

练习3.25 3.3.3节划分分数段的程序是使用下标运算符实现的,请利用迭代器改写该程序实现完全相同的功能。

#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;

int main()
{
    vector<int> vec(11, 0);
    int temp;
    while (cin >> temp)
    {
        if (temp <= 100)
            ++(*(vec.begin() + temp / 10));
    }
    for (auto i = vec.begin(); i != vec.end(); ++i)
        cout << *i << " ";
    cout << endl;
    return 0;
}

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

因为迭代器之间支持的运算只有’-’,而没有’+’。end-beg指相距若干元素,将它除以2之后与beg相加,表示移动到一beg与end中间的位置。

练习3.27 假设txt_size 是一个无参函数,它的返回值是int。请回答下列哪个定义是非法的,为什么?

unsigned buf_size = 1024;
(a) int ia[buf_size];
(b) int ia[4 * 7 - 14];
(c) int ia[txt_size()];
(d) char st[11] = "fundamental";

a非法,buf_size不是常量表达式

b合法

c非法,txt_size()返回值不是常量表达式

d非法,没有空间存放空字符

练习3.28 下列数组中元素的值是什么?

string sa[10]; //十个空字符串
int ia[10];    //十个为0的int型变量
int main() {
    string sa2[10];//十个空字符串
    int ia2[10];    //十个未定义的值
}

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

数组的大小是确定的,且不可扩展

数组间不能拷贝和赋值

数组本身没有方法可以使用

练习3.30 指出下面代码中的索引错误。

constexpr size_t array_size = 10;
int ia[array_size];
for (size_t ix = 1; ix <= array_size; ++ix)
    ia[ix] = ix;

访问越界

猜你喜欢

转载自blog.csdn.net/qq_40758751/article/details/102733524
今日推荐