重新定义数据区域以加快访问速度

时间:2016-09-06 11:34:00

标签: c++

c ++新手。我搜索过但可能使用错误的术语。

我想在多个插槽的数组中找到哪个插槽存储了几个字节长的字面值。目前按顺序检查每个插槽。

如果我可以使用内部函数扫描整个数组,就好像它是一个大字符串,我觉得这会快得多。 (旧COBOL程序员)。

我能以任何方式做到这一点吗?

2 个答案:

答案 0 :(得分:1)

  

我想在多个插槽的数组中找到哪个插槽存储了几个字节长的字面值。目前按顺序检查每个插槽。

好的,我打算采取行动并推断:

  1. 您希望在某种容器中存储任意长度的字符串文字。

  2. 容器必须是可变的(即你可以随意添加文字)

  3. 容器中不会有重复项。

  4. 您想知道之前是否存储在容器中的字符串文字,以及它所处的“位置”,以便您可以在必要时将其删除。

  5. 字符串文字将以随机词典顺序插入,无需排序。

  6. 想到的容器是std::unordered_set

    #include <unordered_set>
    std::unordered_set<std::string> tokens;
    
    int main()
    {
        tokens.emplace("foo");
        tokens.emplace("bar");
        auto it = tokens.find("baz");
        assert(it == tokens.end());   // not found
        it = tokens.find("bar");      // will be found
        assert(it != tokens.end());
        tokens.erase(it);             // remove the token
    }
    

    此容器的搜索时间复杂度为O(1)。

答案 1 :(得分:0)

正如您在评论中已经发现的那样,“扫描为一个大字符串”不是C ++的方法。

使用C风格的数组时,C ++中的典型代码通常是足够快的线性搜索

auto myStr = "result";
auto it = std::find_if(std::begin(arr), std::end(arr), 
                       [myStr](const char* const str) { return std::strcmp(mystr,str) == 0; });

请记住字符串比较功能在第一个错误字符处停止。

更多C ++风格:

std::vector<std::string> vec = { "res1", "res2", "res3" };
std::string myStr = "res2";
auto it = std::find(vec.begin(), vec.end(), myStr);

如果您对快速查找大容器感兴趣,std::unordered_set是可行的方法,但“插槽”已经失去了意义,但也许在这种情况下std::unordered_map可以使用

std::unordered_set<std::string> s= { "res1", "res2", "res3" };
std::string myStr = "res2";
auto it = s.find(myStr);

所有代码都是作为示例编写的,未编译/测试