【问题标题】:C++ STL: Finding string in vector of string using std::find doesn't work [closed]C ++ STL:使用std :: find在字符串向量中查找字符串不起作用[关闭]
【发布时间】:2015-03-16 22:52:14
【问题描述】:
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<string> vs;
    vs.push_back("i");
    vs.push_back("like");
    vs.push_back("apples");
    vs.push_back("but");
    vs.push_back("am");
    vs.push_back("allergic");
    vs.push_back("to");
    vs.push_back("apples");

    string sbut("but");

    string s = find(vs.begin(), vs.end(), sbut);
    s = find(vs.begin(), vs.end(), "but");

    return 1;
}

这是我的测试代码。 我有一个场景,我将字符串存储在向量中,并且必须检查该向量中是否存在字符串。

我收到以下错误消息但我无法理解,两种情况的 find 返回不同类型的错误:

stringfind.cpp:20:47: error: conversion from ‘__gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >’ to non-scalar type ‘std::string {aka std::basic_string<char>}’ requested
     string s = find(vs.begin(), vs.end(), sbut);

stringfind.cpp:21:7: error: no match for ‘operator=’ (operand types are ‘std::string {aka std::basic_string<char>}’ and ‘__gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >’)
     s = find(vs.begin(), vs.end(), "but");

使用 -std=c++11 选项编译

谁能告诉我发生了什么以及如何实现这个场景?

编辑:对不起,我的意思是我使用

进行检查
if(vs.end()!=find(vs.begin(),vs.end(), "but")

写测试程序太快了

【问题讨论】:

  • 您是否阅读过std::find 的文档?
  • std::find 从什么时候开始返回字符串?无论如何,您为什么要再次将结果存储在字符串中?你已经有了它:它是sbut。 -1 甚至没有假装做任何研究。

标签: c++ string c++11 vector stl


【解决方案1】:

find 返回一个迭代器,而不是一个字符串。您需要检查迭代器是否有效以查看是否找到了字符串。

vector<string>::iterator it = find(vs.begin(), vs.end(), sbut);
if (it != vs.end()) {
    // string found!
}

【讨论】:

  • 你甚至不需要这样做。如果搜索成功,那么你已经有了你的字符串:它是sbut
  • 要获得更完整的答案,您可能需要解释为什么两次调用会出现两种不同的错误消息。
猜你喜欢
  • 2017-07-07
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2014-07-10
相关资源
最近更新 更多