-3

我有一个类将提供一个函数,该函数带有一个看到的项目,它将false在第一次看到它时返回某个字符串,但true之后每次调用相同的字符串。

class Tracking
{
     ...
public:
     bool itemseen(const char* str)
     {
         ..
     }       
};
4

2 回答 2

2

听起来您需要/想要 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,您可以预期它的速度大约是原来的两倍(尽管缓存可能会使第二次搜索更快,因此测量的差异可能会小于该速度)。

于 2013-02-06T02:57:34.080 回答
2

最简单的方法是使用 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;
}
于 2013-02-06T02:59:05.373 回答