c ++新手。我搜索过但可能使用错误的术语。
我想在多个插槽的数组中找到哪个插槽存储了几个字节长的字面值。目前按顺序检查每个插槽。
如果我可以使用内部函数扫描整个数组,就好像它是一个大字符串,我觉得这会快得多。 (旧COBOL程序员)。
我能以任何方式做到这一点吗?
答案 0 :(得分:1)
我想在多个插槽的数组中找到哪个插槽存储了几个字节长的字面值。目前按顺序检查每个插槽。
好的,我打算采取行动并推断:
您希望在某种容器中存储任意长度的字符串文字。
容器必须是可变的(即你可以随意添加文字)
容器中不会有重复项。
您想知道之前是否存储在容器中的字符串文字,以及它所处的“位置”,以便您可以在必要时将其删除。
字符串文字将以随机词典顺序插入,无需排序。
想到的容器是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);
所有代码都是作为示例编写的,未编译/测试