⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 习题3.15 .txt

📁 c++ primer 答案(第4版) 自己整理的 只有1-5章
💻 TXT
字号:
习题3.14 

读入一段文本到vector对象,每个单词存储为vector中的一个元素。把vector对象中每个单词转化为大写字母。输出vector对象中转化后的元素,每8个单词为一行输出。

【解答】

//读入一段文本到vector对象,每个单词存储为vector中的一个元素。

//把vector对象中每个单词转化为大写字母。

//输出vector对象中转化后的元素,每8个单词为一行输出

#include <iostream>

#include <string>

#include <vector>

#include <cctype>

using namespace std;

int main()

{

    vector<string> svec;

    string str;

    // 读入文本到vector对象

    cout << "Enter text(Ctrl+Z to end):" << endl;

    while (cin>>str)

        svec.push_back(str);

    //将vector对象中每个单词转化为大写字母,并输出

    if (svec.size() == 0) {

        cout << "No string?!" << endl;

        return -1;

    }

    cout << "Transformed elements from the vector:" 

         << endl;

    for (vector<string>::size_type ix = 0; ix != svec.size(); ++ix) {

        for (string::size_type index = 0; index != svec[ix].size(); ++index)

            if (islower(svec[ix][index])) 

                //单词中下标为index的字符为小写字母

                svec[ix][index] = toupper(svec[ix][index]);

        cout << svec[ix] << " ";

        if ((ix + 1) % 8 == 0)//每8个单词为一行输出

            cout << endl;

    }

    return 0;

}

习题3.15 

下面程序合法吗?如果不合法,如何更正?

vector<int> ivec;

ivec[0] = 42;

【解答】

不合法。因为ivec是空的vector对象,其中不含任何元素,而下标操作只能用于获取已存在的元素。

更正:将赋值语句改为语句ivec.push_back(42);。

习题3.16 

列出三种定义vector对象的方法,给定10个元素,每个元素值为42。指出是否还有更好的实现方法,并说明为什么。

【解答】

方法一:

vector<int> ivec(10, 42);

方法二:

vector<int> ivec(10);

for (ix = 0; ix < 10; ++ix)

    ivec[ix] = 42;

方法三:

vector<int> ivec(10);

for (vector<int>::iterator iter = ivec.begin(); 

iter != ivec.end(); ++iter)

    *iter = 42;

方法四:

vector<int> ivec;

for (cnt = 1; cnt <= 10; ++cnt)

    ivec.push_back(42);

方法五:

vector<int> ivec;

vector<int>::iterator iter = ivec.end();

for (int i = 0; i != 10; ++i) {

    ivec.insert(iter, 42);

    iter = ivec.end();

}

各种方法都可达到目的,也许最后两种方法更好一些。它们使用标准库中定义的容器操作在容器中增添元素,无需在定义vector对象时指定容器的大小,比较灵活而且不容易出错。

习题3.17 

重做3.3.2节的习题,用迭代器而不是下标操作来访问vector中的元素。

【解答】

重做习题3.13如下:

//读一组整数到vector对象,计算并输出每对相邻元素的和

//使用迭代器访问vector中的元素

#include <iostream>

#include <vector>

using namespace std;

int main()

{

    vector<int> ivec;

    int ival;

    //读入数据到vector对象

    cout << "Enter numbers(Ctrl+Z to end):" << endl;

    while (cin>>ival)

        ivec.push_back(ival);

    //计算相邻元素的和并输出

    if (ivec.size() == 0) {

        cout << "No element?!" << endl;

        return -1;

    }

    cout << "Sum of each pair of adjacent elements in the vector:" 

         << endl;

    vector<int>::size_type cnt = 0;

    for (vector<int>::iterator iter = ivec.begin();

                               iter < ivec.end()-1; 

                               iter = iter + 2) {

        cout << *iter + *(iter+1) << "\t";

        ++cnt;

        if ( cnt % 6 == 0) //每行输出6个和

            cout << endl;

    }

    if (ivec.size() % 2 != 0) //提示最后一个元素没有求和

        cout << endl 

             << "The last element is not been summed " 

              << "and its value is " 

             << *(ivec.end()-1) << endl;

    return 0;

}

//读一组整数到vector对象,计算首尾配对元素的和并输出

//使用迭代器访问vector中的元素

#include <iostream>

#include <vector>

using namespace std;

int main()

{

    vector<int> ivec;

    int ival;

    //读入数据到vector对象

    cout << "Enter numbers(Ctrl+Z to end):" << endl;

    while (cin>>ival)

        ivec.push_back(ival);

    //计算首尾配对元素的和并输出

    if (ivec.size() == 0) {

        cout << "No element?!" << endl;

        return -1;

    }

    cout << "Sum of each pair of counterpart elements in the vector:" 

         << endl;

    vector<int>::size_type cnt=0;

    for (vector<int>::iterator first = ivec.begin(), 

                             last = ivec.end() - 1;

                             first < last; 

                             ++first, --last) {

        cout << *first + *last << "\t";

        ++cnt;

        if ( cnt % 6 == 0) //每行输出6个和

            cout << endl;

    }

    if (first == last) //提示居中元素没有求和

        cout << endl 

             << "The center element is not been summed " 

             << "and its value is " 

             << *first << endl;

    return 0;

}

重做习题3.14如下:

//读入一段文本到vector对象,每个单词存储为vector中的一个元素。

//把vector对象中每个单词转化为大写字母。

//输出vector对象中转化后的元素,每8个单词为一行输出。

//使用迭代器访问vector中的元素

#include <iostream>

#include <string>

#include <vector>

#include <cctype>

using namespace std;

int main()

{

    vector<string> svec;

    string str;

    //读入文本到vector对象

    cout << "Enter text(Ctrl+Z to end):" << endl;

    while (cin>>str)

        svec.push_back(str);

    //将vector对象中每个单词转化为大写字母,并输出

    if (svec.size() == 0) {

        cout << "No string?!" << endl;

        return -1;

    }

    cout << "Transformed elements from the vector:" 

         << endl;

    vector<string>::size_type cnt = 0;

    for (vector<string>::iterator iter = svec.begin(); 

         iter != svec.end(); ++iter) {

        for (string::size_type index = 0; index != (*iter).size();

             ++index)

            if (islower((*iter)[index])) 

                //单词中下标为index的字符为小写字母

                (*iter)[index] = toupper((*iter)[index]);

        cout << *iter << " ";

        ++cnt;

        if (cnt % 8 == 0)//每8个单词为一行输出

            cout << endl;

    }

    return 0;

}

习题3.18 

编写程序来创建有10个元素的vector对象。用迭代器把每个元素值改为当前值的2倍。

【解答】

//创建有10个元素的vector对象,

//然后使用迭代器将每个元素值改为当前值的2倍

#include <iostream>

#include <vector>

using namespace std;

int main()

{

    vector<int> ivec(10, 20);//每个元素的值均为20

    //将每个元素值改为当前值的2倍

    for (vector<int>::iterator iter = ivec.begin(); 

                             iter != ivec.end(); ++iter) 

        *iter = (*iter)*2;

    return 0;

}

习题3.19 

验证习题3.18的程序,输出vector的所有元素。

【解答】

//创建有10个元素的vector对象,

//然后使用迭代器将每个元素值改为当前值的2倍并输出

#include <iostream>

#include <vector>

using namespace std;

int main()

{

    vector<int> ivec(10, 20);//每个元素的值均为20

    //将每个元素值改为当前值的2倍并输出

    for (vector<int>::iterator iter = ivec.begin(); 

                                    iter != ivec.end(); ++iter) {

        *iter = (*iter)*2;

        cout << *iter << " ";

    }

    return 0;

}

习题3.20 

解释一下在上几个习题的程序实现中你用了哪种迭代器,并说明原因。

【解答】

上述几个习题的程序实现中使用了类型分别为vector<int>::iterator和vector <string>::iterator的迭代器,通过这些迭代器分别访问元素类型为int和string的vector对象中的元素。

习题3.21 

何时使用const迭代器?又在何时使用const_iterator?解释两者的区别。

【解答】

const迭代器是迭代器常量,该迭代器本身的值不能修改,即该迭代器在定义时需要初始化,而且初始化之后,不能再指向其他元素。若需要指向固定元素的迭代器,则可以使用const迭代器。

const_iterator是一种迭代器类型,对这种类型的迭代器解引用会得到一个指向const对象的引用,即通过这种迭代器访问到的对象是常量。该对象不能修改,因此,const_iterator类型只能用于读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素而无需修改它们,则可以使用const_iterator。

习题3.22 

如果采用下面的方法来计算mid会产生什么结果?

vector<int>::iterator mid = (vi.begin() + vi.end())/2;

【解答】

将两个迭代器相加的操作是未定义的,因此用这种方法计算mid会出现编译错误。

习题3.23 

解释下面每个bitset对象包含的位模式:

(a) bitset<64> bitvec(32);

(b) bitset<32> bv(1010101);

(c) string bstr; cin >> bstr; bitset<8> bv(bstr);

【解答】

(a) bitvec有64个二进制位,(位编号从0开始)第5位置为1,其余位置均为0。

(b) bv有32个二进制位,(位编号从0开始)第0、2、4、5、7、8、11、13、14、16、17、18、19位置为1,其余位置均为0。因为十进制数1010101对应的二进制数为000000000000011110110100110110101。

(c) bv有8个二进制位,(位编号从0开始)用读入的字符串的从右至左的8个字符对bv的0~7位进行初始化。

习题3.24 

考虑这样的序列1,2,3,5,8,13,21,并初始化一个将该序列数字所对应的位置设置为1的bitset<32>对象。然后换个方法,给定一个空的bitset对象,编写一小段程序把相应的数位设置为1。

【解答】

bitset<32>对象的初始化:

bitset<32> bv(0x20212e)

方法二:

bitset<32> bv;

int x = 0, y = 1, z;

z = x + y;

while (z <= 21) {

    bv.set(z);

    x = y;

    y = z;

    z = x + y;

}

注意,设置为1的数位的位编号符合斐波那契数列的规律。

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -