【发布时间】:2014-12-02 23:25:15
【问题描述】:
我目前有一个返回字符串的函数。我需要跟踪这些返回的字符串,如果没有对返回的字符串执行操作,那么我必须对其执行操作。
我的第一个想法是使用向量(即)std::vector。
这是利用向量的机制的样子
1-使用 std::find 检查项是否存在于向量中
std::find(vector.begin(), vector.end(), item)!=vector.end()
2-如果项目不存在,则执行 push_back(摊销常数) 并对其执行操作,否则忽略字符串
我的第二个想法是使用 std::set
1-通过插入功能检查集合中是否存在项目 如果不插入它
if(set.insert(somestring).second)
{
//Item inserted in set and it did not exist
}
insert in set 的时间复杂度为O(logn)。向量的 push_back 是 Amortized 常数,如果向量未排序(在此未排序)std::find 将为 O(n)。我的假设是否正确,即为了最大效率我应该在这里使用一个集合?有什么我可能会错过的吗?
【问题讨论】:
-
我是新手,但为什么不使用哈希表、std::map 或 std::unordered_map 来检查它是否存在?无论如何,您都在存储字符串。
-
"如果向量没有排序(在此它不是),它将是 O(logn)" - O(logn) 是多少?
-
刚刚更新。我的意思是
std::find上的std::vector<std::string>将 O(n) -
在
vector上的查找是 O(n)。在set上的查找是 O(log n)。在unordered_set上的查找是 O(1)。我认为我们有一个明显的赢家。 -
@MorphingDragon 是的,但他必须写那个。其他选项,他有免费的。