从向量中复制字符串不起作用

时间:2013-06-21 21:35:16

标签: c++

如果该单词不包含元音,我正在尝试将单词复制到文件中。这是我的尝试,但它不起作用。它将单词复制到文件中,但不排除带元音的单词。我不知道为什么它会输出它的作用......

#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 << " ";
    }
}

in.txt

  

你好我的朋友和家人

输出到out.txt

  

myllofriendsandfamily

3 个答案:

答案 0 :(得分:3)

---使用noskipws ---

实际上那是一个思想家。这是使用C ++ 11进行的最小返工。我希望你能从中收集一些有用的东西:

#include <iostream>
#include <iterator>
#include <string>
#include <vector>

template <typename It>
bool has_vowel(It begin, It end)
{
    while (begin!=end)
    {
        char lower = std::tolower(static_cast<unsigned char>(*begin));

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

        ++begin;
    }
    return false;
}

int main()
{
    std::istream_iterator<std::string> f(std::cin), l;

    for (auto& s : std::vector<std::string>(f, l))
    {
        if (!has_vowel(s.begin(), s.end()))
            std::cout << s << " ";
    }
}

直播: http://ideone.com/1tYfs2

或者,避免使用矢量:

#include <algorithm>

int main()
{
    std::istream_iterator<std::string> f(std::cin), l;

    for_each(f, l, [] (std::string const& s) {
            if (!has_vowel(s.begin(), s.end()))
                std::cout << s << " ";
        });
}

答案 1 :(得分:3)

除非你感到受虐待,否则使用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一起使用,因此您无需在执行此任务时将所有单词存储在向量中:

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;
                    });

答案 2 :(得分:2)

您正在错误地打开输出文件。 std::fstream不会丢弃该文件的旧内容。请改用std::ofstream