(C++) 学习向量 - coding/input 流 termination/comparing 向量的问题
(C++) Learning vectors - problems with coding/input stream termination/comparing vectors
我是从 Bjarne Stroustrup 的书中学习我的第一门编程语言 C++ 的初学者 "Programming Principles and Practice Using C++"。第 4 章讨论向量。之前解释的一切我都会很容易理解并且代码总是可以正常工作,直到现在。
我写的代码根本不起作用。以下代码是为小练习而制作的,其中输入内容被读入并打印出单词,将不喜欢的单词删除。
#include "std_lib_facilities.h"
int main() {
vector<string>text;
string disliked = "cat";
for (string word; cin >> word;) {
text.push_back(word);
}
for (int a = 0; a < text.size(); ++a) {
if (text[a] != disliked) {
cout << text[a] << endl;
}
else {
cout << "BLEEP\n";
}
}
keep_window_open();
}
我的第一个想法是创建另一个向量 vector<string>disliked ={"cat", ...}
,用于不喜欢的词,但是 if (text[x] != disliked)
似乎不是比较每个向量中元素的方法(至少它是警告我关于运算符和操作数不匹配的问题)。有办法吗?
但是回到代码:经过一些修改并且输入中没有任何不喜欢的词,程序有时会 运行。我仍然无法满足主要目的。也许,真正的错误是在输入端。 Ctrl+Z 对我不起作用,只是输入一个字符。不知何故 Ctrl+C 恰好可以正常工作(如果没有不喜欢的词)。
那么真正的问题来了:
代码是否正确? (因为我无法自己检查,而我可能一直在不正确地终止输入)
考虑到 Ctrl+Z 只会向输入添加一个字符,我如何才能以任何其他方式终止输入?
有没有办法通过比较 "input" 向量和 "disliked" 向量来使这个程序运行?
我猜你有两个选择:
1.从文本文件中获取输入。
在这种情况下,您必须将数据放在项目目录中的文本文件中。例如,在下面发布的代码中,"text.txt" 是应该存储输入(你的话)的地方。
小说明:
我不确定 "std_lib_facilities.h" 包含什么,所以我添加了一些标准头文件来为我编译代码。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> texts;
std::string dislikedWord = "cat";
std::ifstream fin("text.txt");
for (std::string word; fin >> word;)
texts.push_back(word);
unsigned textsCount = texts.size();
for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
if (texts[textIndex] != dislikedWord)
std::cout << texts[textIndex] << '\n';
else
std::cout << "BLEEP\n";
return 0;
}
2。继续读单词,直到最终满足条件。
在这种情况下(如果您不想从文本文件中读取)您应该插入一个条件使程序停止接受输入,这样您就可以继续进行下去。条件可以是可以读取的最大字数或一些 'special' 字。在下面的示例中,我选择在十个字处结束阅读。
小注:也许你做练习的那一章告诉你要插入什么条件。我怀疑您是否必须使用 CTRL+C 或任何其他组合键来解决该练习。
#include <iostream>
#include <vector>
#include <string>
int main()
{
const unsigned totalWords = 10;
std::vector<std::string> texts;
std::string dislikedWord = "cat";
for (std::string word; std::cin >> word;) {
texts.push_back(word);
if (texts.size() == totalWords) // could've put it in the for condition
break; // terminates the for-loop
}
unsigned textsCount = texts.size();
for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
if (texts[textIndex] != dislikedWord)
std::cout << texts[textIndex] << '\n';
else
std::cout << "BLEEP\n";
return 0;
}
Is the code correct? (since I can't check it myself while I might have been terminating the input improperly entire time)
似乎对我有用。
How can I terminate input any other way, considering that Ctrl+Z only adds a character to the input?
我用Ctrl-D
来标记行尾。
Is there a way of making this program work by comparing the "input" vector with the "disliked" vector?
通常当你比较类型时(==
和 !=
)它们具有相同的类型(或者编译器可以将一种类型转换为与另一种类型相同的类型(但那是为了这里比较迂腐,初学者最好考虑比较同类对象))。
vector<string> text;
string disliked = "cat";
// STUFF
if (text[x] != disliked) // disliked is a string
// text[x] is a string (because we are accessing the `x` element.
如果我们将 disliked 改为向量:
vector<string> text;
vector<string> disliked = "cat";
// STUFF
if (text[x] != disliked) // disliked is a vector<string>
// text[x] is a string
由于类型不匹配,因此很难进行比较。所以需要遍历disliked中的所有元素,看能不能找到这个词。
bool found = false;
for(std::size_t loop = 0; loop < disliked.size(); ++loop) {
if (text[x] == disliked[loop) { // Types are the same here.
found = true;
break;
}
}
if (!found) {
有一些技巧可以使上面的代码紧凑。如果你刚刚开始,这可能有点早,但为了完整起见,我会在这里添加它:
bool found = std::find(std::begin(disliked), std::end(disliked), text[x]) != std::end(disliked);
if (!found) {
我是从 Bjarne Stroustrup 的书中学习我的第一门编程语言 C++ 的初学者 "Programming Principles and Practice Using C++"。第 4 章讨论向量。之前解释的一切我都会很容易理解并且代码总是可以正常工作,直到现在。
我写的代码根本不起作用。以下代码是为小练习而制作的,其中输入内容被读入并打印出单词,将不喜欢的单词删除。
#include "std_lib_facilities.h"
int main() {
vector<string>text;
string disliked = "cat";
for (string word; cin >> word;) {
text.push_back(word);
}
for (int a = 0; a < text.size(); ++a) {
if (text[a] != disliked) {
cout << text[a] << endl;
}
else {
cout << "BLEEP\n";
}
}
keep_window_open();
}
我的第一个想法是创建另一个向量 vector<string>disliked ={"cat", ...}
,用于不喜欢的词,但是 if (text[x] != disliked)
似乎不是比较每个向量中元素的方法(至少它是警告我关于运算符和操作数不匹配的问题)。有办法吗?
但是回到代码:经过一些修改并且输入中没有任何不喜欢的词,程序有时会 运行。我仍然无法满足主要目的。也许,真正的错误是在输入端。 Ctrl+Z 对我不起作用,只是输入一个字符。不知何故 Ctrl+C 恰好可以正常工作(如果没有不喜欢的词)。
那么真正的问题来了:
代码是否正确? (因为我无法自己检查,而我可能一直在不正确地终止输入)
考虑到 Ctrl+Z 只会向输入添加一个字符,我如何才能以任何其他方式终止输入?
有没有办法通过比较 "input" 向量和 "disliked" 向量来使这个程序运行?
我猜你有两个选择:
1.从文本文件中获取输入。
在这种情况下,您必须将数据放在项目目录中的文本文件中。例如,在下面发布的代码中,"text.txt" 是应该存储输入(你的话)的地方。
小说明: 我不确定 "std_lib_facilities.h" 包含什么,所以我添加了一些标准头文件来为我编译代码。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> texts;
std::string dislikedWord = "cat";
std::ifstream fin("text.txt");
for (std::string word; fin >> word;)
texts.push_back(word);
unsigned textsCount = texts.size();
for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
if (texts[textIndex] != dislikedWord)
std::cout << texts[textIndex] << '\n';
else
std::cout << "BLEEP\n";
return 0;
}
2。继续读单词,直到最终满足条件。
在这种情况下(如果您不想从文本文件中读取)您应该插入一个条件使程序停止接受输入,这样您就可以继续进行下去。条件可以是可以读取的最大字数或一些 'special' 字。在下面的示例中,我选择在十个字处结束阅读。
小注:也许你做练习的那一章告诉你要插入什么条件。我怀疑您是否必须使用 CTRL+C 或任何其他组合键来解决该练习。
#include <iostream>
#include <vector>
#include <string>
int main()
{
const unsigned totalWords = 10;
std::vector<std::string> texts;
std::string dislikedWord = "cat";
for (std::string word; std::cin >> word;) {
texts.push_back(word);
if (texts.size() == totalWords) // could've put it in the for condition
break; // terminates the for-loop
}
unsigned textsCount = texts.size();
for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
if (texts[textIndex] != dislikedWord)
std::cout << texts[textIndex] << '\n';
else
std::cout << "BLEEP\n";
return 0;
}
Is the code correct? (since I can't check it myself while I might have been terminating the input improperly entire time)
似乎对我有用。
How can I terminate input any other way, considering that Ctrl+Z only adds a character to the input?
我用Ctrl-D
来标记行尾。
Is there a way of making this program work by comparing the "input" vector with the "disliked" vector?
通常当你比较类型时(==
和 !=
)它们具有相同的类型(或者编译器可以将一种类型转换为与另一种类型相同的类型(但那是为了这里比较迂腐,初学者最好考虑比较同类对象))。
vector<string> text;
string disliked = "cat";
// STUFF
if (text[x] != disliked) // disliked is a string
// text[x] is a string (because we are accessing the `x` element.
如果我们将 disliked 改为向量:
vector<string> text;
vector<string> disliked = "cat";
// STUFF
if (text[x] != disliked) // disliked is a vector<string>
// text[x] is a string
由于类型不匹配,因此很难进行比较。所以需要遍历disliked中的所有元素,看能不能找到这个词。
bool found = false;
for(std::size_t loop = 0; loop < disliked.size(); ++loop) {
if (text[x] == disliked[loop) { // Types are the same here.
found = true;
break;
}
}
if (!found) {
有一些技巧可以使上面的代码紧凑。如果你刚刚开始,这可能有点早,但为了完整起见,我会在这里添加它:
bool found = std::find(std::begin(disliked), std::end(disliked), text[x]) != std::end(disliked);
if (!found) {