我有一个类将提供一个函数,该函数带有一个看到的项目,它将false
在第一次看到它时返回某个字符串,但true
之后每次调用相同的字符串。
class Tracking
{
...
public:
bool itemseen(const char* str)
{
..
}
};
听起来您需要/想要 anstd::set<std::string>
或std::unordered_set<std::string>
.
当您收到一个项目时,尝试将其插入到 [unordered_] 集合中。检查返回值以查看是否成功。
请注意,首先搜索该项目,然后在它不存在时尝试插入是相当浪费的。您通常只想尝试插入它,然后检查返回值是否成功:
class whatever {
std::set<std::string> strings;
public:
bool itemseen(std::string const &input) {
return !strings.insert(input).second;
}
};
如果您进行搜索然后插入,则当/如果它插入新对象时,您将强制它搜索集合两次。相反,使用返回值允许您只进行一次搜索。IOW,您可以预期它的速度大约是原来的两倍(尽管缓存可能会使第二次搜索更快,因此测量的差异可能会小于该速度)。
最简单的方法是使用 STL:
#include <set>
#include <string>
std::set<std::string> seen;
bool itemseen(const char* str)
{
if (seen.find(str) == seen.end())
{
seen.insert(str);
return false;
}
return true;
}