【问题标题】:Better way to sort 2 "linked" arrays? [duplicate]对 2 个“链接”数组进行排序的更好方法? [复制]
【发布时间】:2016-08-31 14:00:36
【问题描述】:

我有 2 个存储“链接”属性的向量。这就是我的意思:

std::vector<std::string> names;
std::vector<int> ids;

// Name of object with an ID of 5
auto name = names[std::find(ids.begin(), ids.end(), 5) - ids.begin()];

每个对象都有一个名称和一个 ID,因此索引 n 处的对象的名称为 name[n],ID 为 ids[n]

现在我想按字母顺序对名称进行排序。我可以使用std::sort

std::sort(names.begin(), names.end());

但是现在 ID 不匹配了!我想过做一个成对的向量,把每个名字/id放进去,排序,然后提取数据。

这不是很有效,因为我必须在两个向量的每个元素上循环 2 次,并且向量有很多元素。

看到我不能从一开始就使用对的向量而不是 2 个向量,我该如何提高效率?

【问题讨论】:

  • 一对向量似乎是这里的方式。你只在结构上循环一次,你可以在排序中定义你想要排序的内容。
  • @Hayt 但要从对中提取名称和 ID 需要另一个循环
  • 您尝试过使用std::map&lt;std::string, int&gt; 吗?我认为这可以解决您的问题。您可以为std::sort btw 提供自定义比较功能;)
  • 如果您仅按字符串排序,则地图将起作用。但我假设您想在 ID 和名称排序之间切换?
  • @meetaig 也许std::map&lt;ID as int, then std::string&gt; 会好很多。由于 ID 与地图的键相同

标签: c++ performance optimization c++14


【解决方案1】:

您可以使用 std::map 字符串到 int 将名称映射到它们的索引(这是相同的 id 索引),如果您也想订购 id 另一个 std::map int 到 int 映射 id到他们的索引(这是相同的名称索引)。

通过这种方式,您可以保持数组不变,并拥有两个有序结构,可以为您提供快速访问数组所需的索引。

【讨论】:

  • 这会复制数据,考虑到数量,这并不理想
  • 是的,但我能想到的其他方式是包含名称和 is(被您丢弃)的结构向量或以相同方式对两个数组进行排序的排序过程(这意味着每次都重新排序您从名称排序传递到 ids 排序并丢失初始顺序)
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 2021-12-31
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2021-11-14
  • 2014-02-11
相关资源
最近更新 更多