《C++primer》第九章课后习题

devtools/2024/9/23 6:33:02/

在这里插入图片描述

练习9.1

答:a选list,因为需要从容器的中间位置插入元素;b选vector,因为只需要在尾部插入元素;c没有最优,选择vector
在这里插入图片描述

练习9.2

list<deque<int>> l;

在这里插入图片描述

练习9.3

答:指向同一个容器的元素,并且end不在begin前

练习9.4

bool isExit(vector<int> v, int a)
{for (auto i = v.begin();i!=v.end();++i)if (*i == a)return true;return false;
}

练习9.5

vector<int>::iterator isExit(vector<int> &v, int a)
{for (auto it = v.begin(); it != v.end(); ++it)if (*it == a)return it;return v.end();
}

练习9.6

答:小于号错误,应该使用等于号
在这里插入图片描述

练习9.7

答:const_iterator

练习9.8

答:const_iterator, iterator
在这里插入图片描述

练习9.9

答:begin返回的是iterator,cbegin返回的是const_iterator

练习9.10

答:reference;const_reference;iterator;const_iterator
在这里插入图片描述

练习9.11

	vector<int> a1;//创建一个空容器vector<int> a2(10);//创建一个空容器,大小为10个元素vector<int> a3(10, 1);//创建一个大小为10个元素的容器,其中每个值都为1vector<int> a4(a2);//用a2的值初始化vector<int> a5{ 1,2,3,4,5,6 };//大小为六,值为1,2,3,4,5,6vector<int> a6(a3.begin(), a3.end());//用a3的值初始化

练习9.12

答:接受一个容器的,两容器类型必须相同;接受迭代器的可以不同
在这里插入图片描述

练习9.13

list<int> l = {1,2,3,4,5};
vector<int> v1 = {1,2,3,4,5};
vector<double> v2(l.begin(),l.end());
vector<double> v3(v1.begin(),v1.end());

在这里插入图片描述

练习9.14

list<char *> l = {'1','2','3'};
vector<string> s(l);

在这里插入图片描述

练习9.15

bool isEqual(vector<int> v1,vector<int> v2)
{if(v1==v2)return true;return false;
}

练习9.16

bool isEqual(vector<int> v1, list<int> l1)
{int i = 0;for (auto const& a : l1){*v1.begin()++ != a;return false;}return true;
}

练习9.17

答:容器类型和元素类型必须相同

在这里插入图片描述

练习9.18

int main()
{string s;deque<string> d;while (cin >> s)d.push_back(s);for (auto i = d.begin(); i != d.end(); ++i)cout << *i << " ";return 0;
}

练习9.19

int main()
{string s;list<string> d;while (cin >> s)d.push_back(s);for (auto i = d.begin(); i != d.end(); ++i)cout << *i << " ";return 0;
}

练习9.20

int main()
{list<int> l = { 1,2,3,4,5,6 };vector<int> v1;vector<int> v2;for (auto const& a : l){if (a % 2 == 0)v2.push_back(a);elsev1.push_back(a);}return 0;
}

练习9.21

vector<string> v1;string word;auto iter = v1.begin();while (cin >> word)iter = v1.insert(iter, word);

练习9.22

答:循环不会终止

while (iter != mid) {if (*iter == some_val) {iter = iv.insert(iter, 2 * some_val);++iter;  // 插入后移动迭代器到下一个位置mid = iv.begin() + iv.size() / 2;  // 重新计算 mid}++iter;}

在这里插入图片描述

练习9.23

答:值都相同

练习9.24

int main()
{vector<int> v1 = { 1,2,3,4,5,6 };vector<int> v2 = { v1[0],v1.at(0),v1.front(),*v1.begin() };for (auto const& a : v2)cout << a << " ";return 0;
}

在这里插入图片描述

练习9.25

答:若elem1与elem2相等,则删除的范围为空;若elem1与elem2皆为尾后迭代器,则不会删除元素

练习9.26

int main()
{int ia[] = { 0,1,1,2,3,5,8,13,21,55,89 };vector<int> v1;list<int> l1;for (int i = 0; i <11; ++i){v1.push_back(ia[i]);l1.push_back(ia[i]);}for (auto i = v1.begin(); i != v1.end(); ++i){if (*i % 2 == 0)i = v1.erase(i);}for (auto i = l1.begin(); i != l1.end(); ++i){if (*i % 2 != 0)i = l1.erase(i);}return 0;
}

在这里插入图片描述

练习9.27

forward_list<int> v1;
auto pre = v1.before_begin();
auto i = v1.begin()for (; i != v1.end(); ++i){if (*i % 2 != 0)i = v1.erase_after(pre);else{pre = i;++i;}}

练习9.28

void myInsert(forward_list<string> s1,string s2, string s3)
{auto i = s1.begin();for (; i != s1.end(); ++i){if (*i == s2){s1.insert_after(i, s3);return;}}s1.insert_after(i,s3);
}

在这里插入图片描述

练习9.29

答:将容器大小扩展为100;将容器大小减小为10

练习9.30

答:如果是类类型元素,则该类必须有默认构造函数。
在这里插入图片描述

练习9.31

list<int> vi = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};auto iter = vi.begin();while (iter != vi.end()) {if (*iter % 2) {iter = vi.insert(iter, *iter); // 复制当前元素advance(iter, 2); // 向前移动迭代器,跳过当前元素以及插入到它之前的元素} else {iter = vi.erase(iter); // 删除偶数元素,erase 返回下一个有效迭代器}}

练习9.32

答:不合法,因为函数可能先计算iter或先计算*iter++,所以不合法

练习9.33

答:每次修改的值都会是新插入的值

练习9.34

答:将偶数值元素复制
在这里插入图片描述

练习9.35

答:capacity是查询能容纳的元素个数,size是当前容器拥有的元素个数

练习9.36

答:不可能

练习9.37

答:list不是预分配一块连续的内存,其内存需求是动态变化的,不存在容量限制;array的大小是在创建时就确定的

练习9.38

vector<int> v1;v1.reserve(50);while (v1.size() != v1.capacity())v1.push_back(0);cout << "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;v1.push_back(0);cout << "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;

运行结果如下:
在这里插入图片描述

练习9.39

答:向容器中添加元素,每次读取结束,将容器大小扩大二分之一

练习9.40

答:1536,1536,1536,2304
在这里插入图片描述

练习9.41

vector<char> v1 = { 'a' };
string s1(v1.begin(),v1.end());

练习9.42

string str;
str.reserve(100);  // 预分配至少 100 个字符的空间
char ch;
int count = 0;
while (std::cin.get(ch)) {  // 从标准输入读取字符,假设每次读取一个字符str.push_back(ch);count++;if (count >= 100) break;  // 假设我们只读取 100 个字符}

在这里插入图片描述

练习9.43

void replaceString(string &s, const string &oldVal, const string &newVal) {auto it = s.begin();while (it != s.end()) {// 检查当前迭代器位置后的子串是否等于 oldValif (std::string(it, it + oldVal.size()) == oldVal) {// 使用 erase 和 insert 替换子串it = s.erase(it, it + oldVal.size());it = s.insert(it, newVal.begin(), newVal.end());// 移动迭代器到新插入部分的末尾it += newVal.size();} else {++it;}}
}

练习9.44

void replaceString(string &s, const string &oldVal, const string &newVal) {size_t pos = 0;while ((pos = s.find(oldVal, pos)) != string::npos) {s.replace(pos, oldVal.size(), newVal);pos += newVal.size(); // 移动位置以避免重复替换}
}

练习9.45

std::string addPrefixSuffix(const string &name, const string &prefix, const string &suffix) {string result = name;result.insert(result.begin(), prefix.begin(), prefix.end());result.append(suffix);return result;
}

练习9.46

string addPrefixSuffix(const string &name, const string &prefix, const string &suffix) {string result = name;result.insert(0, prefix); // 插入前缀result.insert(result.size(), suffix); // 插入后缀return result;
}

在这里插入图片描述

练习9.47

void findDigitsAndLettersUsingFindFirstOf(const string &str) {string numbers = "0123456789";string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";string::size_type pos = 0;// 查找数字字符cout << "Digits: ";while ((pos = str.find_first_of(numbers, pos)) != string::npos) {cout << str[pos] << ' ';++pos;}cout << endl;pos = 0;// 查找字母字符cout << "Letters: ";while ((pos = str.find_first_of(letters, pos)) != std::string::npos) {std::cout << str[pos] << ' ';++pos;}cout << std::endl;
}

练习9.49

ifstream file("words.txt");if (!file) {cerr << "Cannot open file." << endl;return 1;}set<char> ascenders = {'b', 'd', 'f', 'h', 'k', 'l', 't'};set<char> descenders = {'g', 'j', 'p', 'q', 'y'};string longestWord;string word;while (file >> word) {bool hasAscenderOrDescender = false;for (char c : word) {if (ascenders.count(c) || descenders.count(c)) {hasAscenderOrDescender = true;break;}}if (!hasAscenderOrDescender && word.length() > longestWord.length()) {longestWord = word;}}cout << "The longest word without ascenders or descenders is: " << longestWord << std::endl;

在这里插入图片描述

练习9.50

// 计算整型值的和
int sumOfIntegers(const vector<string>& vec) {int sum = 0;for (const auto& str : vec) {sum += stoi(str);}return sum;
}
// 计算浮点值的和
double sumOfDoubles(const vector<string>& vec) {double sum = 0.0;for (const auto& str : vec) {sum += stod(str);}return sum;
}

练习9.51

class Date {
public:Date(const string& dateStr) {parseDate(dateStr);}void printDate() const {cout << year << "-" << month << "-" << day << endl;}
private:unsigned year = 0, month = 0, day = 0;const map<string, unsigned> monthMap = {{"January", 1}, {"February", 2}, {"March", 3}, {"April", 4},{"May", 5}, {"June", 6}, {"July", 7}, {"August", 8},{"September", 9}, {"October", 10}, {"November", 11}, {"December", 12},{"Jan", 1}, {"Feb", 2}, {"Mar", 3}, {"Apr", 4},{"May", 5}, {"Jun", 6}, {"Jul", 7}, {"Aug", 8},{"Sep", 9}, {"Oct", 10}, {"Nov", 11}, {"Dec", 12}};void parseDate(const std::string& dateStr) {istringstream iss(dateStr);string monthStr, dayStr, yearStr;if (isalpha(dateStr[0])) {// Case: "January 1, 1900" or "Jan 1 1900"iss >> monthStr >> dayStr >> yearStr;dayStr.pop_back();  // Remove comma if present} else if (isdigit(dateStr[0])) {// Case: "1/1/1990"getline(iss, monthStr, '/');getline(iss, dayStr, '/');getline(iss, yearStr);}if (isdigit(monthStr[0])) {month = stoul(monthStr);} else {month = monthMap.at(monthStr);}day = stoul(dayStr);year = stoul(yearStr);}
};

http://www.ppmy.cn/devtools/46251.html

相关文章

Elasticsearch REST API 初探:索引与搜索文档的奥秘

在当今数据驱动的时代&#xff0c;高效的数据检索和存储成为了众多企业和项目的关键需求。Elasticsearch 作为一款基于 Lucene 的开源搜索和分析引擎&#xff0c;凭借其分布式、可扩展和高性能的特性&#xff0c;成为了处理大规模数据的首选工具。本文将带你初步探索 Elasticse…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 你有没有听说过Nginx的账户认证功能&#xff1f;这可不只是一个技术问题&#xff0c;它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样&#xff0c;Nginx的账户认证功能就是确保有只有授权的人才能…

mysql存储地理信息的方法

MySQL 存储地理信息通常使用 GEOMETRY 数据类型或其子类型&#xff08;如 POINT, LINESTRING, POLYGON 等&#xff09;。为了支持这些数据类型&#xff0c;MySQL 提供了 SPATIAL 索引&#xff0c;这允许我们执行高效的地理空间查询。 1. 创建支持地理信息的表 首先&#xff0…

【三维重建NeRF(三)】Mip-NeRF论文解读

本文结合深蓝学院课程学习和本人的理解&#xff0c;欢迎交流指正 文章目录 Mip-NeRF流程简述混叠问题与MipMapMip-NeRF提出的解决办法圆锥台近似计算与集成位置编码(IPE) Mip-NeRF流程简述 Mip-NeRF的大体流程和NeRF基本是一样的&#xff0c;NeRF介绍 创新的部分就是针对NeRF…

导航时间与坐标转换

前言&#xff1a; 该章节代码均在Gitee中开源&#xff1a;因为这章是学校作业&#xff0c;所以稍微正经点. 时空位置转换https://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/%E5%AF%BC%E8%88%AA%E6%97…

golang语言的gofly快速开发框架如何设置多样的主题说明

本节教大家如何用gofly快速开发框架后台内置设置参数&#xff0c;配置出合适项目的布局及样式、主题色&#xff0c;让你您的项目在交互上加分&#xff0c;也是能帮你在交付项目时更容易得到客户认可&#xff0c;你的软件使用客户他们一般都是不都技术的&#xff0c;所以当他们拿…

spring通过xml配置文件实现依赖注入的方法

在 Spring 框架中&#xff0c;使用 XML 配置文件来实现依赖注入主要有以下几种方法&#xff1a; 通过构造器注入&#xff08;Constructor Injection&#xff09;通过 Setter 方法注入&#xff08;Setter Injection&#xff09;通过静态工厂方法注入通过实例工厂方法注入通过 p…

Satellite Stereo Pipeline学习

1.在Anaconda某个环境中安装s2p pip install s2p 2.在Ubuntu系统中安装s2p源代码 git clone https://github.com/centreborelli/s2p.git --recursive cd s2p pip install -e ".[test]" 3.在s2p中进行make all处理 中间会有很多情况&#xff0c;基本上哪个包出问题…