【问题标题】:How do i order vector containing strings in accordance with another pre sorted vector of strings?我如何根据另一个预先排序的字符串向量对包含字符串的向量进行排序?
【发布时间】:2014-09-23 06:33:24
【问题描述】:

所以程序会先输入用户名,然后是 ID,并将它们存储在向量 vName 和 vID 中。例如,我有一个这样的代码,它需要一个字符串名称

cout << "what is your name?";
getline(cin sName)
vName.push_back(sName)

 cout << "what is your name?";
 getline(cin sName)
 vName.push_back(sName)

如果用户输入姓名 Paul 和 Leto 以及 ID 123 和 456,并且如果我计算出向量中的元素,我将完全按照我放入它们的方式取回它们。但是如果我决定像这样对 vName 进行排序

(vName.begin(), vName.end());  

我发现元素 Leto 将与 123 匹配,而 Paul 将与 456 匹配。我如何防止这种情况发生?我如何做到这一点,无论 vName 是如何排序的,vID 都会改变,以便 ID 与名称匹配?

【问题讨论】:

  • 存储同时包含名称和 ID 的对象?
  • 我不明白你在问我问题吗?
  • 你甚至不必发明一个结构。如果您选择走简单的路线,则为您提供了一个:std::vector&lt;std::pair&lt;std::string, int&gt;&gt;。但是请注意,无论您如何追求这一点,如果这与this question 相关,它就会对binary_search 之类的东西提出一个有趣的挑战,即如果您搜索的只是“名称”成员,则自定义比较器。 std::map 可能更合适。
  • @ZeeZeeZee 我在问这个解决方案是否合适。
  • @juanchopanza 啊好吧我明白了。这是我在弄清楚如何做到这一点时的第一种方法,但前提条件之一是将它们存储在不同的容器中是不可能的。

标签: c++ sorting vector


【解决方案1】:

你应该使用结构体:

struct Person {
  string name;
  int id;
};
vector<Person> people;

如果您不喜欢这样,您可以通过首先使用名称作为排序代理对您的 ID 向量进行排序来进行“代理排序”。在这些解决方案中的任何一个中,您都需要实现自己的谓词以按名称字段进行排序。

【讨论】:

  • +1 用于指出对仅名称(或仅 id、或 name-id 或 id-name)进行排序的必要谓词。
  • 好的,我想我了解 struct 的工作原理,这可能是一种更好的方法。谢谢
  • 以防万一,这里有一个解释 proxy sorting 的链接。您创建第三个索引向量,从 0 到 n-1,根据 vName 对索引向量进行排序,然后根据现在排序的索引向量复制或重新排列 vName 和 vId。
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多