2013-02-06 60 views
-3

我有一个类将提供一个函数看到的一个项目,它将返回false第一次看到某个字符串,但每次后true当相同的字符串被调用。C++跟踪一个项目,然后返回

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

有一个问题在这里? –

+0

这个问题没有显示研究工作。 – Johnsyweb

回答

2

这听起来像你需要/想任何一个std::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,你可以预计它会快两倍(虽然缓存可能会使第二次搜索更快,所以测量的差异可能会比这小)。

+1

虽然你可能不想在'set'中存储'const char *'s。 – Johnsyweb

+0

啊,我没有想到这个意图。 – chris

+1

@Johnsyweb:好点 - 澄清。 –

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; 
} 
+1

如果你有点混淆。找到它后插入它。 – chris

+0

相反的比较,然后当我试图修复它时,SO正好下降。虽然修复了它。 – Jack