使用std :: find来检查字符串向量的问题

时间:2014-10-24 23:51:29

标签: c++ c++11 std

我是一名C ++新手,在掌握一些概念方面遇到了麻烦,特别是在while循环中使用std :: find,检查数组。

我有一些PHP背景,但对C ++ /低级语言来说还是一个新手。我的具体问题是在程序结束时我有while(检查>> word){}循环。 Visual Basic在我的std :: find上给了我一个错误。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, char* argv[]){
    //Open the dictionary file(it is called words.txt).
    ifstream myFile;
    myFile.open("dictionary.txt");
    //Define a vector of strings called words.
    std::vector<string> dictionary;
    //For each word in the dictionary file
    string word;
    while (myFile >> word){
        //Append the word to the words vector.
        dictionary.push_back(word);
    }
    //Open the file to be checked(the file is specified on the command line)
    ifstream check;
    check.open(argv[2]);
    //For each word in that file
    while (check >> word){
        //check vector dictionary to see if check >> word exists
        if (std::find(dictionary.begin(), dictionary.end(), word)){
            //If the word is not contained in the dictionary vector print the word.
        }
    }
    return 0;
}

如果这已经得到回答,我很抱歉,但是我已经看了几个主题,并且我会继续查看更多内容,直到我得到它,但我仍然有点失落。我会继续努力解决自己的问题!

感谢您的帮助!

编辑:Visual Basic发出了智能感知错误;但是,当我将while循环更改为此

时,它就消失了
while (check >> word){
    //check vector dictionary to see if check >> word exists
    if (std::find(dictionary.begin(), dictionary.end(), word) == dictionary.end()){
        //If the word is not contained in the dictionary vector print the word.
        cout << word << endl;
    }
}

3 个答案:

答案 0 :(得分:3)

你的条件应该是:

std::find(dictionary.begin(), dictionary.end(), word) == dictionary.end()

请注意,在您的情况下,您可以使用map代替,然后使用

dictionary.count(word) == 0

答案 1 :(得分:2)

我认为您最大的问题之一就是您认为C ++是一种较低级别的语言。你在这些事情上花了很长时间,并且在这个过程中让自己的生活变得更加困难。

我可能更喜欢这样做:

std::ifstream in("dictionary.txt");

// read all the words from the file:
std::vector<std::string> dictionary{std::istream_iterator<std::string>(in),
                                    std::istream_iterator<std::string>() };

// If the words might not already be sorted, sort them:
// std::sort(dictionary.begin(), dictionary.end());

// open the file to check:
std::ifstream check(argv[2]);

// print out the words that aren't in the dictionary:
std::copy_if(std::istream_iterator<std::string>(check), 
             std::istream_iterator<std::string>(),
             std::ostream_iterator<std::string>(std::cout, "\n"),
             [&](std::string const &word) { 
                 return !std::binary_search(dictionary.begin(), dictionary.end(), word);
             });

这通常具有显着的速度优势,因为它使用二进制搜索而不是字典中的线性搜索。

答案 2 :(得分:1)

这个怎么样

int len = dictionary.size();
bool flag = true;
for(int i = 0; i < len; i++)
{
    if(dictionary[i] == word) {
        flag = false;
        break;
    }
}
if(flag)
    cout<<word<<"\n";
else
;