C ++:两个指向同一结构的指针向量,每个向量都有不同的排序

时间:2015-03-26 21:13:28

标签: c++ sorting pointers vector structure

我有一个人的结构课。每个人都有自己的名称,主要ID和次要ID。为了有效搜索,我实现了二进制搜索。问题是,我希望有效地(优于O(n))搜索人员不仅通过他们的主要ID,而且还通过他们的辅助ID。但是这些人只能通过一个参数进行分类。所以我想是否有可能制作两个指向人员结构的指针向量,一个按主要ID排序,另一个用辅助ID排序。

例如,两个人:Mark Smith,主要ID为9845613,次要ID为1312469,John Doyle为主要3213444,次要为2654722.因此,m_byPrim向量的第一个元素和m_bySec向量的第二个元素应该指向John Doyle。 / p>

这甚至可能吗?以下是我到目前为止编写的相关代码的一部分:

#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>

using namespace std;

class CPersons
{
public:
  bool AddPerson (const string &name,
                  unsigned int primID,
                  unsigned int secID);

private:
  struct Person {
    Person (const string & init_name,
            unsigned int init_primID,
            unsigned int init_secID)
     : m_name (init_name), m_primID (init_primID), m_secID (init_secID){}

      string m_name;
      unsigned int m_primID;
      unsigned int m_secID;
  };
  vector<Person*>m_byPrim;
  vector<Person*>m_bySec;
};

bool CPersons::AddPerson (const string &name, 
                          unsigned int primID, 
                          unsigned int secID){

  int positionPrim;
  int positionSec;

  return false;
}

int main ( void )
{
  CPersons a;
  a.AddPerson ( "Mark Smith", 9845613, 1324697 );
  a.AddPerson ( "John Doyle", 3213444, 2654722 );
  return 0;
}

位置整数是我的二元搜索功能(插入人员的位置)的结果,我已经设法成功实现了,所以假设这个位置已经初始化了。

但我的问题是如何实现添加指针向量?我仍然是指针(和一般的C ++)的新手,所以我不知道我的想法是否有效和可能。感谢您的任何提示和帮助;帮助

编辑:我忘了提到从STL容器中我只能使用矢量。

2 个答案:

答案 0 :(得分:1)

请尝试使用std :: map:

,而不是使用已排序的向量
class CPersons
{
public:
  bool AddPerson (const string &name, unsigned int primID, unsigned int secID);

private:
  struct Person {
    Person (const string & init_name, unsigned int init_primID, unsigned    int init_secID)
      : m_name (init_name), m_primID (init_primID), m_secID (init_secID) {}

      string m_name;
      unsigned int m_primID;
      unsigned int m_secID;
  };
  map<unsigned int, Person*>m_byPrim;
  map<unsigned int, Person*>m_bySec;
};

bool CPersons::AddPerson (const string &name, unsigned int primID, unsigned int secID){

  p = new Person(name, primID, secID);
  m_byPrim[primID] = p;
  m_bySec[secID] = p;

  return false;
}

使用矢量的缺点:

  • 如果您将人物插入到列表末尾以外的任何位置,则向量中已有的所有内容都必须&#34;向下冒泡&#34;,将其复制到列表中的新位置。
  • 随着向量的增长,它将定期需要重新分配,并将整个现有元素集复制到新的基础数组中。

使用地图的好处:

  • 向列表添加新元素的影响很小
  • 添加和查找元素的界面比在排序的矢量中查找更方便和可读。

答案 1 :(得分:0)

由于您无法使用vector以外的任何内容,因此以下是AddPerson函数的外观:

bool CPersons::AddPerson(
        const string &name, unsigned int primID, unsigned int secID) {
    // I'm assuming that the two functions below binary-search to get
    // the positions where inserting the elements into the arrays would
    // maintain their sorting
    int positionPrim = getPositionPrim();
    int positionSec = getPositionSec();
    Person *person = new Person(name, primID, secID);
    m_byPrim.insert(m_byPrim.begin() + positionPrim, person);
    m_bySec.insert(m_bySex.begin() + positionSec, person);
    return false;
}

您还需要定义析构函数,因为您正在使用动态内存:

CPersons::~CPersons()
{
    for (const auto &i: m_byPrim) {
        delete i;
    }


}