用于在数据结构中查找" "之间的字符串的代码

Code for finding string between "" in a data structure

本文关键字:之间 字符串 代码 查找 数据结构 用于      更新时间:2023-10-16

我需要帮助来解决以下问题:

假设我在int var中有数字70368,并且我想在下面的结构中找到相应的字符串"EVT_ACP_CAPT_MIC_FLT",并将其(包括")加载到char*事件变量

代码解决方案必须适用于1到5之间的任何数字长度。

struct NameOffset TestEvents[] = {
    { "EVT_ACP_CAPT_LAST1", 70387 },
    { "EVT_ACP_CAPT_LAST1", 70387 },
    { "EVT_ACP_CAPT_LAST2", 70512 },
    { "EVT_ACP_CAPT_LAST2", 70512 },
    { "EVT_ACP_CAPT_MASK_BOOM_SWITCH", 70385 },
    { "EVT_ACP_CAPT_MIC_FLT", 70368 },
    { "EVT_ACP_CAPT_MIC_HF1", 70510 },
    { "EVT_ACP_CAPT_MIC_HF2", 70511 },
 };

这张表真的很长,这只是几行显示的结构。

假设struct NameOffset的字段是NameOffset,您可以使用循环找到匹配项,如下所示:

for (int i = 0 ; i != sizeof(TestEvents)/sizeof(struct NameOffset) ; i++) {
    if (PmdgEvents[i].Offset == intVar) {
        printf("%sn", PmdgEvents[i].Name);
        break;
    }
}

强力方法是使用循环并比较第二个结构成员来识别正确的结构。

如果代码将定期执行,您应该使用unordered_map:将数据加载到unordered_map<int, string>(或者如果您愿意,可以使用char *而不是string),然后使用

event_map[code];

以访问字符串。

#include <unordered_map>
#include <iostream>
using namespace std;
struct NameOffset {
    const char *event;
    int code;
};
struct NameOffset TestEvents[] = {
    { "EVT_ACP_CAPT_LAST1", 70387 },
    { "EVT_ACP_CAPT_LAST2", 70512 },
    { "EVT_ACP_CAPT_MASK_BOOM_SWITCH", 70385 },
    { "EVT_ACP_CAPT_MIC_FLT", 70368 },
    { "EVT_ACP_CAPT_MIC_HF1", 70510 },
    { "EVT_ACP_CAPT_MIC_HF2", 70511 },
 };
#define N_ELEMENTS (sizeof(TestEvents) / sizeof(NameOffset))
int main() {
    unordered_map<int, const char *> event_map;
    for (NameOffset *it = TestEvents, *it_end = TestEvents + N_ELEMENTS;
            it != it_end; ++it) {
        event_map[it->code] = it->event;
    }
    cout << event_map[70387] << endl;
    cout << event_map[70512] << endl;
    cout << event_map[70385] << endl;
    cout << event_map[70368] << endl;
    cout << event_map[70510] << endl;
    cout << event_map[70511] << endl;
    return 0;
}

创建一个<int,string>的Map,然后用要搜索的相应值索引该Map

#include<iostream>
#include<map>
#include<string>
using namespace std;    
int main (){    
    std::pair<int,string> TestEvents[] = {
    make_pair( 70387,"EVT_ACP_CAPT_LAST1"  ),
    make_pair( 70???,"EVT_ACP_CAPT_LAST1"  ),
    make_pair( 70512,"EVT_ACP_CAPT_LAST2"  ),
    make_pair( 70512,"EVT_ACP_CAPT_LAST2"  ),
    make_pair(  70385, "EVT_ACP_CAPT_MASK_BOOM_SWITCH" ),
    make_pair( 70368,"EVT_ACP_CAPT_MIC_FLT"  ),
    make_pair( 70510,"EVT_ACP_CAPT_MIC_HF1"  ),
    make_pair( 70511,"EVT_ACP_CAPT_MIC_HF2"  )
    };
    map<int,string> mapTestEvents(TestEvents,TestEvents + sizeof TestEvents / sizeof TestEvents[0]);
    int var = 70368;
    const char* event = mapTestEvents[var].c_str();
    return 0;
    }

请注意,我假设整数值是唯一的,否则整个问题语句将无效。

还有另一种使用std::sort和std::lower_bound 的方法

#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
struct NameOffset {
    string name;
    int offset;
    };
NameOffset TestEvents[] = {
    { "EVT_ACP_CAPT_LAST1", 70387 },
    { "EVT_ACP_CAPT_LAST1", 70387 },
    { "EVT_ACP_CAPT_LAST2", 70512 },
    { "EVT_ACP_CAPT_LAST2", 70512 },
    { "EVT_ACP_CAPT_MASK_BOOM_SWITCH", 70385 },
    { "EVT_ACP_CAPT_MIC_FLT", 70368 },
    { "EVT_ACP_CAPT_MIC_HF1", 70510 },
    { "EVT_ACP_CAPT_MIC_HF2", 70511 },
    };
bool CompareByEvent(NameOffset const& lhs, NameOffset const& rhs) {
    return lhs.offset < rhs.offset;
    }
int main (){
    sort(TestEvents,TestEvents + sizeof TestEvents / sizeof TestEvents[0], &CompareByEvent);
    NameOffset var = {"",70510};
    const char* event =lower_bound(TestEvents,TestEvents + sizeof TestEvents / sizeof TestEvents[0], var,&CompareByEvent)->name.c_str();
    return 0;
    }