使用向量找到共同元素的问题

时间:2013-12-07 04:35:56

标签: c++ visual-c++ object vector stdvector

我试图找到两个向量之间的公共元素(song_list),在我的user.h文件中我有两个向量,我试图在另一个类(help.cpp)中使用这个向量,但我不能正确。请问我的代码有什么问题?它没有运行,我不完全确定这是否是正确的方法。

user.h

   #pragma once
  #include <string>
  #include <vector>
  #include <string>

    using namespace std;

    class User
  {

public:

User(void);
~User(void);


      public:


struct user1
      {
        string name;
    int age;
    string song_list;
       };

       typedef vector <user1> u1;

       struct user2
       {
       string name;
   int age;
   string song_list;
       };
      typedef vector <user2> u2;

       };

help.cpp

  #include "Help.h"
  #include "User.h"
  #include <iterator>  
  #include <cstdlib>
  #include <iostream>
  #include <vector>
  #include <algorithm>





  int commonElements();
  int commonElements(){

  vector <user1> u1;
  vector <user2> u2;

  std::sort(u1.begin(), u1.end());
  std::sort(u2.begin(), u2.end());
  std::vector<string> common;

  std::set_intersection(u1.begin(), u1.end(), u2.begin(), u2.end(),                       
  std::back_inserter(common));

   cout<<common<<endl;
   }

到目前为止我的代码。用户姓名,年龄和歌曲列表的所有数据都在.txt文件中。

1 个答案:

答案 0 :(得分:1)

您似乎对类型与实例有些混淆。你正在创建一些单独的类型(我很确定)你只需要两个实例。例如,(对我而言)您确实希望u1u2成为相同类型对象的向量。

user.h:

#pragma once
#include <string>
#include <vector>
#include <string>

using namespace std;

struct user {
    string name;
    int age;
    vector<string> song_list;
};

help.cpp:

#include "Help.h"
#include "User.h"
#include <iterator>  
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>

int commonElements(user &u1, user &u2) {
    sort(u1.song_list.begin(), u1.song_list.end());
    sort(u2.song_list.begin(), u2.song_list.end());
    vector<string> common;

    set_intersection(u1.song_list.begin(), u1.song_list.end(), 
                     u2.song_list.begin(), u2.song_list.end(), 
                     back_inserter(common));

    for (auto const &song : common) 
        cout << song << "\n";

#if 0
    // alternatively, write the intersection directly to the stream:
    set_intersection(u1.song_list.begin(), u1.song_list.end(),
                     u2.song_list.begin(), u2.song_list.end(),
                     ostream_iterator<string>(cout, "\n"));
#endif
}

顺便说一句,人们普遍认为在标题中加上using namespace std;是一个非常糟糕的想法。我离开了它,因为它与手头的问题大多无关,但它应该真的改变。