因此,我有一个.txt文件,正在将其推入向量中,一切正常。 我正在尝试接受用户输入(字符串),并在向量中找到匹配项。 到目前为止,这是我的代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <list>

using namespace std;

struct customer{
  string name;
  float disc;
};

class customer_list {
  vector<customer> custlist;

public:
  void load(string fname){
   ifstream list;
   list.open ("customers.txt");
   customer c;
   double val = 0;
   if (list.is_open()){
     while (! list.eof() ){
       list >> c.name;
       custlist.push_back(c);
       list >> c.disc;
       custlist.push_back(c);
       val++;
     }
   }
     list.close();
     int val2 = custlist.size()/val;

     for (int j=0; j < custlist.size() - 2; j+= val2){
         cout << " Name: " << custlist[j].name << endl;
         cout << " Discount: " << custlist[j+1].disc << endl;
     }
  }


bool in_list(string & query){ //return true if query in list, false otherwise
  if (find (custlist.begin(), custlist.end(), query) !=custlist.end()){
    cout << "Welcome back," << query << "." <<endl;
    return true;
  }else{
    cout << "No Matches found." << endl;
    return false;
  }
 }
};

int main (){

customer_list a;
string name;

a.load("customers.txt");

cout << "What is your name?" << endl;
cin >> name;

a.in_list(name);
}

运行时出现此错误:

In file included from prt2.cpp:1:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream:38:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios:216:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale:15:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:439:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:865:22: error: invalid operands
      to binary expression ('customer' and 'const std::__1::basic_string<char>')
        if (*__first == __value_)
            ~~~~~~~~ ^  ~~~~~~~~
prt2.cpp:46:15: note: in instantiation of function template specialization 'std::__1::find<std::__1::__wrap_iter<customer *>,
      std::__1::basic_string<char> >' requested here
          if (find (custlist.begin(), custlist.end(), query) !=custlist.end()){
              ^
1 error generated.

任何帮助表示赞赏! 谢谢。

===============>>#1 票数:1

您的find是将苹果与橙子进行比较。 使用std::find寻求的搜索值必须与序列的类型相同或可以转换为序列的类型,严格意义上并非如此,但通常会被实践。 您可以使用比较两个值的等效运算符( operator == )来规避它,即使它们是不同的类型,但实际上并不需要疯狂。 无论如何,您都在customer填充的丛林中搜索std::string

您可以使用其他搜索方法(例如std::find_if和自定义合格的lamda表达式)来解决此问题:

像这样:

bool in_list(const string & s)
{
    if (std::find_if(custlist.begin(), custlist.end(),
            [&s](const customer& c) { return c.name == s; }) != custlist.end())
    {
        cout << "Welcome back," << s << "." <<endl;
        return true;
    }

    cout << "No Matches found." << endl;
    return false;
}

当然,还有其他方法。

无论如何,祝你好运。

===============>>#2 票数:0

您需要包括: #include <algorithm>

正确使用std :: find。

它将起作用。

您也可以完善代码的这一部分:

   if (list.is_open()){
 while (! list.eof() ){
   list >> c.name;
   custlist.push_back(c);
   list >> c.disc;
   custlist.push_back(c);
   val++;
 }}

通过使用此:

   if (list.is_open()){
 while (! list.eof() ){
   list >> c.name;
   list >> c.disc;
   custlist.push_back(c);
   val++;
 }}

因为您使用向量的2个elem仅存储一个elem,例如,如果您使用yop 42.42,则向量中将包含:

  • vector [0] .name =“ yop”;
  • vector [0] .disc = undifined_value;
  • vector [1] .name =“”;
  • vector [1] .disc = 42.42;

更正后,您将具有:

  • vector [0] .name =“ yop”;
  • vector [0] .disc = 42.42;

要在结构上使用std :: find函数,您还必须添加以下函数:

bool operator==(const customer &c, const string &name){
return (c.name == name);
}

std :: find将调用此函数来检查值。

===============>>#3 票数:0

您只需要使用运算符重载,因为您正在使用具有自定义类型的向量,但是vector中的std :: find()方法只能比较原始类型中的值。 尝试以下功能:

bool operator ==(const customer_list& other) const{
  return other.name==this->name;
}

  ask by SwizzleStix617 translate from so

未解决问题?本站智能推荐:

4回复

向量问题,C ++不确定我做错了什么

好的,所以我对C ++还是相当陌生,这是我第一次使用向量。 我的目标是将对象存储到向量中。 我正在尝试遵循以下YouTube教程: http://www.youtube.com/watch?v=iPlW5tSUOUM 我认为除了他的跑步之外,我的几乎是一样的。 我只是不断收
3回复

如何从向量中查找和删除对象?

我有一个名为GradeBook的类,并且已经在该类中定义了包含学生ID,姓名和等级的对象。 我的代码的这一部分正常工作,并将对象存储到向量中并正确打印。 我已经尝试了几个小时,无法弄清或找到如何获取用户输入的整数,查找它是否与向量中的学生ID匹配并删除相应的行。 我的代码: 更
2回复

如何使用迭代器和find / find_f在类的C ++向量中查找真实值

我在尝试使类关联正常工作时遇到了麻烦。 我有一个矢量类对象,名为Items。 每个项目都有一个值,例如名称,价格等。在Items类中,有setter和getter来更改值并返回它们。 我知道可以使用这样的东西(请参阅下面的内容(尚未编译,只是快速键入以给您一个想法))可以使用并且
1回复

如何在for循环中擦除向量中的对象时,如何防止出现分段错误?

[编辑2]这可能是因为表面在被其他对象仍在使用时被释放...所以我想写它,所以只有在屏幕上没有更多的对象时它才会被释放。 [编辑] [更新]我修复了代码以使用迭代器,我仍然遇到同样的问题...我刚刚确认这是对象的析构函数的问题。 在类中,析构函数调用SDL_FreeSurface(ima
4回复

C ++中的向量和多态

我的处境很棘手。 它的简化形式是这样的 然后在一堂课上我做类似... 在另一堂课中... 他们以某种方式共享此指令向量。 我关心的是我执行“执行”功能的部分。 能行吗 它会保留其添​​加类型吗?
1回复

在向量中对指针使用删除

我是一个业余编码员,正在尝试通过在控制台上制作文本RPG游戏来学习。 我只是想考虑一下现在如何设计我的代码,而我陷入了项目和库存类如何协同工作的困境。 我有这样定义的库存类: 最终,我计划让敌人死后掉落战利品,因此我需要使用new创建物品,然后将其转移到玩家的物品栏中。 我的问题是
1回复

在类中初始化向量

我有以下问题。 我有一堂课 现在,我想为类MyClass编写一个构造函数,该构造函数读取一个文件,并根据文件的内容初始化向量mynumbers。 我所做的是以下 但是我收到错误消息“类型'std :: vector'不提供调用运算符”。 我也不能使用构造函数初始化列表(至少
1回复

类内struct中的向量

所以,我有这个结构: 和这个班: 和以下代码行: 产生此错误: 我该如何解决?
1回复

使用向量析构函数时出现奇怪的错误[重复]

这个问题已经在这里有了答案 : 11个月前关闭。 析构函数在被显式调用时被调用两次 (10个答案) 因此,当我不调用向量类的析构函数时,我的代码可以正常
1回复

语法错误:OO C ++中的向量数组

我有一个我正在尝试制作的HashTable类的大纲。 我从Visual Studio输出3个错误,但我在这里看不到问题。 我对C ++中的OO相当新,所以它可能是我错过的东西。 它声称我的矢量数组存在问题。 错误是: 这是我的完整课程,现在它很空: