gpt4 book ai didi

c++ - 从 vector 复制字符串不起作用

转载 作者:太空狗 更新时间:2023-10-29 23:52:07 25 4
gpt4 key购买 nike

我正在尝试将一个不包含元音的单词复制到文件中。这是我的尝试,但没有用。它将单词复制到文件中,但不排除带有元音的单词。我不确定为什么它会输出它所做的事情......

#include <iostream>
#include <string>
#include <sstream>
#include <cctype>
#include <fstream>
#include <vector>

template <typename It>
bool has_vowel(It begin, It end)
{
for (auto it = begin; it != end; ++it)
{
char lower = std::tolower(*it);

if (lower == 'a' || lower == 'e' ||
lower == 'i' || lower == 'o' || lower == 'u')
return true;
}
return false;
}

int main()
{
std::fstream in("in.txt");
std::fstream out("out.txt");
std::vector<std::string> v;
std::string str;

while (in >> str)
{
v.push_back(str);
}

for (auto it = v.begin(); it != v.end(); ++it)
{
if (!has_vowel(it->begin(), it->end()))
out << *it << " ";
}
}

在.txt

Hello my friends and family

输出到out.txt

myllofriendsandfamily

最佳答案

除非您感到自虐,否则使用 find_first_of 编写元音检查代码几乎肯定会容易得多:

struct has_vowel { 
bool operator()(std::string const &a) {
static const std::string vowels("aeiouAEIOU");

return a.find_first_of(vowels) != std::string::npos;
}
};

当你想复制一些容器,但排除满足条件的项目时,你通常想使用 std::remove_copy_if。由于这可以直接与 istream_iteratorostream_iterator 一起使用,因此您在执行此操作时也不需要将所有单词存储在 vector 中:

std::remove_copy_if(std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(out, " "),
has_vowel());

如果你愿意使用 C++11,你可以使用 lambda 作为条件:

std::remove_copy_if(std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(out, " "),
[](std::string const &s) {
return s.find_first_of("aeiouAEIOU") != std::string::npos;
});

关于c++ - 从 vector 复制字符串不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com