练习3.21
请使用迭代器重做3.3.3节的第一个练习。
#include <vector>
#include <iterator>
#include <string>
#include <iostream>
using std::vector;
using std::string;
using std::cout;
using std::endl;
void check_and_print(const vector<int>& vec)
{
cout << "size: " << vec.size() << " content: [";
for (auto it = vec.begin(); it != vec.end(); ++it)
cout << *it << (it != vec.end() - 1 ? "," : "");
cout << "]\n" << endl;
}
void check_and_print(const vector<string>& vec)
{
cout << "size: " << vec.size() << " content: [";
for (auto it = vec.begin(); it != vec.end(); ++it)
cout << *it << (it != vec.end() - 1 ? "," : "");
cout << "]\n" << endl;
}
int main()
{
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10, 42);
vector<int> v4{ 10 };
vector<int> v5{ 10, 42 };
vector<string> v6{ 10 };
vector<string> v7{ 10, "hi" };
check_and_print(v1);
check_and_print(v2);
check_and_print(v3);
check_and_print(v4);
check_and_print(v5);
check_and_print(v6);
check_and_print(v7);
return 0;
}
练习3.22
修改之前那个输出text第一段的程序,首先把text的第一段全部改成大写形式,然后输出它。
#include <iostream>
#include <vector>
#include <cctype>
#include <string>
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 it = text.begin(); it != text.end() && !it->empty(); ++it)
{
for (auto &c : *it)
{
if (isalpha(c)) c = toupper(c);
}
}
for (auto it : text)
{
cout << it << endl;
}
return 0;
}
Footer
练习3.23
编写一段程序,创建一个含有10个整数的vector对象,然后使用迭代器将所有元素的值都变成原来的两倍。输出vector对象的内容,检验程序是否正确。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec(10, 42);
for (auto &it : ivec)
{
it = it * 2;
cout << it << endl;
}
return 0;
}
练习3.24
请使用迭代器重做3.3.3节的最后一个练习。
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
int main()
{
vector<int> ivec;
int i;
while (cin >> i)
{
ivec.push_back(i);
}
for (auto it = ivec.begin(); it != ivec.end() - 1; ++it)
{
cout << *it + *(it + 1) << endl;
}
//---------------------------------
cout << "---------------------------------" << endl;
auto it1 = ivec.begin();
auto it2 = ivec.end() - 1;
while (it1 < it2)
{
cout << *it1 + *it2 << endl;
++it1;
--it2;
}
return 0;
}
练习3.25
3.3.3节划分分数段的程序是使用下标运算符实现的,请利用迭代器改写该程序实现完全相同的功能。
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
int main()
{
vector<unsigned> scores(11, 0);
unsigned grade;
while (cin >> grade)
{
if (grade <= 100)
++*(scores.begin() + grade / 10);
}
for (auto s : scores)
cout << s << " ";
cout << endl;
return 0;
}
练习3.26
在100页的二分搜索程序中,为什么用的是 mid = beg + (end - beg) / 2, 而非 mid = (beg + end) / 2 ; ?
因为迭代器支持的运算只有 - ,而没有 + 。end - beg 意思是相距若干个元素,将之除以2然后与beg相加,表示将beg移动到一半的位置。
练习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) 非法。纬度必须是一个常量表达式。
- (b) 合法。
- © 非法。txt_size() 的值必须要到运行时才能得到。
- (d) 非法。数组的大小应该是12。
练习3.28
下列数组中元素的值是什么?
string sa[10];
int ia[10];
int main() {
string sa2[10];
int ia2[10];
}
数组的元素会被默认初始化。sa 的元素值全部为空字符串,ia 的元素值全部为0。sa2 的元素值全部为空字符串,ia2 的元素值全部未定义。
练习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;
当 ix 增长到 10 的时候,ia[ix] 的下标越界。
版权声明:本文为lxy_2011原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。