首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将字符串向量按特定的预定顺序排序?

如何将字符串向量按特定的预定顺序排序?
EN

Stack Overflow用户
提问于 2018-11-23 02:05:08
回答 5查看 1.9K关注 0票数 8

问题是:我需要对字符串向量进行精确的排序。假设我们有一个常数向量或一个具有精确顺序的数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<string> correctOrder = {"Item3", "Item1", "Item5", "Item4", "Item2"};

接下来,我们有一个动态输入向量,它将有相同的项目,但它们可能是混合的,而且数量较少。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<string> incommingVector = {"Item1", "Item5", "Item3"};

因此,我需要按照顺序排序incomming向量,就像第一个向量,correctOrder,结果必须是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<string> sortedVector = {"Item3", "Item1", "Item5"};

我认为正确的顺序可以用另一种方式表示,但无法理解。有人能帮帮我吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-11-23 02:45:01

您可以创建自己的函子,按照模板向量顺序对矢量进行排序,如下代码所解释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct MyComparator
{
    //static const int x = 9;
  const std::vector<std::string> correctOrder{"Item1", "Item2", "Item3", "Item4", "Item5"};
  bool operator() (const std::string& first,const std::string& second )
  {
      auto firstitr = std::find(correctOrder.begin(),correctOrder.end(),first);
      auto seconditr = std::find(correctOrder.begin(),correctOrder.end(),second);
      return firstitr < seconditr;
  }
};
void printVector(const std::vector<std::string>& input)
{
    for(const auto&elem:input)
    {
        std::cout<<elem<<" , ";
    }
    std::cout<<std::endl;
}
int main()
{
  std::vector<string> incomingVector = {"Item3", "Item5", "Item1"};
  std::cout<<"vector before sort... "<<std::endl;
  printVector(incomingVector);
  std::sort(incomingVector.begin(),incomingVector.end(),MyComparator());
  std::cout<<"vector after sort...."<<std::endl;
  printVector(incomingVector);
  return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2018-11-23 02:12:12

如果默认的比较还不够(词汇表比较),那么您可以做的最简单的事情就是为排序函数提供一个兰卜达,它告诉它哪个字符串放在第一位。您可以有一个unordered_map,其中字符串在correctorder向量中作为键,它们在排序数组中的对应位置作为值。

cmp函数将简单地比较您在incommingVector中提供的键的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unordered_map<string, int> my_map;
for(int i = 0 ; i < correctorder.size() ; i++)
   my_map[correctorder[i]]=i;

auto cmp =[&my_map](const string& s, const string& s1){
   return my_map[s] < my_map[s1];
}   

sort(incommingVector.begin(), incommingVector.end() , cmp);
票数 10
EN

Stack Overflow用户

发布于 2018-11-23 02:21:07

您可以利用std::unordered_map,即用于在恒定时间内将字符串映射为整数的哈希表。您可以使用它来找出给定字符串在向量correctOrder中在O(1)中所占的位置,这样就可以在恒定时间内比较向量incomming中的两个字符串。

考虑以下函数sort_incomming_vector()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <unordered_map>

using Vector = std::vector<std::string>;

void sort_incomming_vector(const Vector& correctOrder /*N*/, Vector& incomming /*M*/)
{
   std::unordered_map<std::string, int> order;

   // populate the order hash table in O(N) time
   for (size_t i = 0; i < correctOrder.size(); ++i)
      order[correctOrder[i]] = i;

   // sort "incomming" in O(M*log M) time
   std::sort(incomming.begin(), incomming.end(),
            [&order](const auto& a, const auto& b) { // sorting criterion
               return order[a] < order[b];
            }
   ); 
}

哈希表order将字符串映射为整数,由此产生的整数被传递给排序算法std::sort的lambda (即排序准则)用于比较向量incomming中的一对字符串,以便排序算法能够相应地对它们进行置换。

如果correctOder包含N元素,incomming包含M元素,那么哈希表可以用O(N)时间初始化,incomming可以按O(M*log M)时间排序。因此,整个算法将在O(N + M*log M)时间内运行。

如果NM大得多,则该解是最优的,因为占优项是N,即O(N + M*log M) ~ O(N)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53444532

复制
相关文章
如何在 Git 上更改分支名称?
在 Git 版本控制系统中,分支是非常重要的概念。分支允许你在项目中进行并行开发和实验,同时保持主分支的稳定性。有时候,你可能需要更改已存在的分支名称,例如纠正拼写错误或者为了更好地描述分支的内容。本文将详细介绍如何在 Git 上更改分支名称。
网络技术联盟站
2023/06/19
1.9K0
如何在 Git 上更改分支名称?
更改Linux网卡名称
转载自:https://blog.csdn.net/yeziand01/article/details/88424624
zy010101
2019/07/02
5.1K0
更改Linux网卡名称
Oracle 更改表名称的几种方式
ALTER TABLE old_table_name RENAME TO new_table_name;(大写为系统命令)
全栈程序员站长
2022/08/29
4.7K0
更改WordPress插件的菜单名称
如果您想在不直接编辑插件的情况下更改WordPress内部管理菜单的名称,您可以使用$menuWordPress管理员中存在的全局变量。操作此数据结构将允许您更改由任何插件添加的管理菜单的文本或名称。这在您希望提供项目内容的清晰度或为客户端提供更好的管理UX的情况下非常有用。
许都博客
2021/06/15
4K0
Github更改账户名称/仓库地址/个人链接后缀
注意:在public profile中修改的name,是主页个人名字,不是仓库地址后缀!!!
浩Coding
2019/07/03
11.4K0
如何在NLP中有效利用Deep Transformer?
2017年,谷歌在“Attention is all you need”一文中首次提出了完全基于self-attention(自注意力)机制的transformer模型,用于处理序列模型的相关问题,如机器翻译等。传统的神经机器翻译模型大都是采用RNN或者CNN作为encoder-decoder模型的基础,而Transformer模型则摒弃了固有的模式,采用完全并行化的结构,在提升了模型的性能的同时提高了训练的速度,目前已经被推广到多项自然语言处理的相关任务当中。
AI科技评论
2020/02/14
9570
如何在NLP中有效利用Deep Transformer?
如何在Linux中更改SSH端口?
SSH(Secure Shell)是一种安全的远程登录协议,它允许您通过网络远程连接到Linux系统并进行管理操作。默认情况下,SSH使用22端口进行通信。然而,为了增强系统的安全性,有时候我们需要更改SSH端口,以减少潜在的攻击。
网络技术联盟站
2023/05/25
9.4K0
如何在Linux中更改SSH端口?
如何在 Linux 中更改主机名?
在 Linux 系统中,主机名是用于标识和区分网络上的不同计算机的名称。默认情况下,Linux 发行版会分配一个主机名给您的计算机,但是有时候您可能需要根据自己的需求更改主机名。在本文中,我们将详细介绍如何在 Linux 中更改主机名,以及更改主机名后可能涉及到的其他配置。
网络技术联盟站
2023/06/09
8.8K0
如何在 Linux 中更改主机名?
linux中有选择的删除目录中的文件
某些场景下我们需要删除目录下指定类型,后缀的文件。这时候就需要一些小技巧。 首先我们先要了解一下模式匹配。在Linux中,shell模式是由以下特殊字符组成的字符串,称为wildcards或者meta
入门笔记
2022/06/02
3K0
如何在 Linux 中更改 Nginx 80 端口?
Nginx 是一个开源的轻量级 Web 服务器替代 apache 来处理高流量的网站。
网络技术联盟站
2022/06/21
5.4K0
如何在 Linux 中更改 Nginx 80 端口?
如何在Ubuntu 14.04上更改PHP设置
PHP是一种服务器端脚本语言,被许多流行的CMS和博客平台使用,如WordPress和Drupal。它也是流行的LAMP和LEMP堆栈的一部分。在设置基于PHP的网站时,更新PHP配置设置是一项常见任务。找到确切的PHP配置文件可能并不容易。有多个PHP安装在服务器上正常运行,每个安装都有自己的配置文件。知道要编辑哪个文件以及当前设置是什么可能有点神秘。
彼岸轮回
2018/09/25
1.7K0
如何在 Linux 中更改 Apache HTTP 端口?
Apache Web Server 是一个免费的开源跨平台 Web 服务器应用程序,用于通过 Internet 提供内容。
网络技术联盟站
2022/06/21
6.3K0
如何在 Linux 中更改 Apache HTTP 端口?
如何在Linux中更改用户ID?
在Linux系统中,每个用户都有一个唯一的用户ID(User ID),用于标识和管理用户的权限和资源访问。有时候,我们需要更改用户ID,可能是为了解决冲突、重组用户组或其他管理需求。本文将详细介绍如何在Linux中更改用户ID的几种方法。
网络技术联盟站
2023/06/08
8.4K0
如何在Linux中更改用户ID?
使用Python实现批量更改文件夹下图片的名称
前几天在Python白银交流群有个叫【belongs】的粉丝问了一个使用Python实现批量更改文件夹下图片的名称的问题,如下图所示。
前端皮皮
2022/08/17
2.6K0
使用Python实现批量更改文件夹下图片的名称
点击加载更多

相似问题

在CKEditor中有选择地触发更改事件

12

如何在Coq中有选择地重写?

15

选择名称匹配,如80%

35

如何在FosUserbundle中有选择地禁用注册?

22

如何在python中有选择地深拷贝?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文