C++:两个指向相同结构的指针 vector ,每个 vector 的排序不同

标签 c++ sorting pointers vector structure

我有一个具有人员结构的类(class)。每个人都有自己的姓名、主 ID 和次 ID。为了有效搜索,我实现了二进制搜索。问题是我想有效地(优于 O(n))搜索人员,不仅要通过他们的主要 ID,还要通过他们的次要 ID。但是这些人只能通过一个参数进行排序。所以我想是否可以制作两个指向 persons 结构的指针 vector ,一个按其主要 ID 排序,另一个按其次要 ID 排序。

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

这可能吗?这是到目前为止我设法编写的相关代码的一部分:

#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;
}

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

但我的问题是如何实现指针 vector 的添加?我对指针(和一般的 C++)还是很陌生,所以我不知道我的想法是否有效和可行。感谢您提供任何提示和帮助。

编辑:我忘了提到在 STL 容器中我只能使用 vector 。

最佳答案

尝试使用 std::map 而不是使用排序 vector :

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;
}

使用 vector 的缺点:

  • 如果您在列表末尾以外的任何地方插入一个人, vector 中已有的所有内容都必须“向下冒泡”,被复制到列表中的新位置。
  • 随着 vector 的增长,它需要定期重新分配,并将整个现有元素集复制到新的底层数组。

使用 map 的好处:

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

关于C++:两个指向相同结构的指针 vector ,每个 vector 的排序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29288965/

相关文章:

c - 与指针比较数组末尾后的一个元素是否定义明确?

c++ - 为动态分配的整数赋值

c++ boost::archives和mySql BLOB,反序列化错误

mysql - 测验布局改进

c - 对指针地址: C的操作

c++ - opencv cv::Ptr 的动态转换

c++ - qmake:处理 gcc 和 msvc 的选项

c++ - 如何实现 is_enum_class 类型特征?

无法对结构数组进行排序

javascript - 如何使用变量而不是字符串按 Mongoose 上的数组索引排序?