加速 C++ 中的练习 3.3
excercise 3.3 in accelerated c++
我正在阅读《加速 c++ 》一书并解决当前的练习 3.3,其中说:
编写一个程序来计算每个不同单词在其输入中出现的次数。
我对这个问题的解决方案是以下代码:
#include <ios>
#include <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
#include <vector>
int main()
{
std::cout << "please enter as many words as wanted" << std::endl;
std::vector<std::string> s;
std::string tempstring;
while(std::cin >> tempstring){
s.push_back(tempstring);
}
std::vector<std::string> unique;
std::vector<int> count;
std::vector<std::string> copy = s;
while(copy.size()>0){
std::string search = copy[0];
int temp = 1;
unique.push_back(search);
for(int i = 1;i < copy.size();++i){
if(copy[i]==search){
++temp;
copy.erase(copy.begin()+i);
}
}
count.push_back(temp);
copy.erase(copy.begin());
}
for(int i = 0;i<unique.size();++i){
std::cout << unique[i] << " occurs " << count[i] << " times" << std::endl;
}
return 0;
}
如果我使用输入Jo Hi Hi Jo Jo Jo me done
,我会得到以下输出:
thinkstation:~c++/accelerated_code/exercises/chapter_3$ ./ex3_3
please enter as many words as wanted
Jo Hi Hi Jo Jo Jo me done
Jo occurs 3 times
Hi occurs 2 times
Jo occurs 1 times
me occurs 1 times
done occurs 1 times
为什么不删除所有Jo
?如果我只是跑
thinkstation:~c++/accelerated_code/exercises/chapter_3$ ./ex3_3
please enter as many words as wanted
Jo Jo Hi
Jo occurs 2 times
Hi occurs 1 times
它工作正常。
在删除重复项的代码中:
for(int i = 1;i < copy.size();++i){
if(copy[i]==search){
++temp;
copy.erase(copy.begin()+i);
}
}
请注意,当您删除一个单词,从而将所有后续单词向下滑动一个索引时,您仍然会递增i
,因此重复检查会跳过下一个单词。
标准库包括几种可用于实现解决方案的算法。您可以使用std::remove
替换用于检查和计数重复项的代码:
while(copy.size()>0){
std::string search = copy[0];
auto new_end = std::remove(copy.begin(), copy.end(), search);
int temp = copy.end() - new_end;
copy.erase(new_end, copy.end());
count.push_back(temp);
unique.push_back(search);
}
其他一些可能对各种解决方案有帮助的算法:std::sort
、std::unique
、std::count
和std::upper_bound
。
相关文章:
- 加速C++练习2.4
- C++ 独特指针练习的向量
- 转换器练习:跳过 if 语句和 if 语句
- 节目练习直播C++
- 所以我正在为我的学校作业练习继承,但我无法正确实施标题保护
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 练习多线程
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- C++ 随机数的字符串练习
- 进行 SFINAE 练习时编译错误
- 用 X 替换字符串中的字符C++练习
- 在C++中使用全局变量进行练习
- 是回文作业练习
- C++原理和练习练习-从输入值n中寻找素数
- 我在LeetCode练习时遇到了一些奇怪的错误
- 贝金纳C++练习解决方案的意外输出
- 练习循环和使用循环 1 次以及如何获取数组的最大值
- 对"车辆的 vtable"的未定义引用 - 面向对象的编程练习
- 用绳子练习
- 英里到千克转换器练习的小语法错误