如果向量包含重复项,则此函数应返回 true。知道为什么它不起作用吗?

This function should return true if a vector contains repeats. Any idea why it isn't working?

本文关键字:true 为什么 不起作用 返回 包含重 向量 函数 如果      更新时间:2023-10-16

我认为这很简单,但是当我传递这个向量时,它返回了true:

   int arr2[] =  {1, 6, 7, 89, 69, 23, 19, 100, 8, 2, 50, 3, 11, 90};               
   std::vector<int> vec2(arr2, arr2 + sizeof(arr2)/sizeof(int));

算法很简单:

(1) 实例化地图。(2) 对于向量中的每个 int,(2i) 如果它不在地图中,请添加它,(2ii) 如果它在地图中,则返回 true。(3) 如果以 for 结尾返回 false已到达循环。

bool contains_repeats_1(const std::vector<int>& V) { 
    std::map<int,bool> M;
    for (std::vector<int>::const_iterator it = V.begin(); it != V.end(); it++) {
        if (M.count(*it) != 0) { 
             M.insert(std::pair<int,bool>(*it, true));
        } else {
            return true;
        }
    }
    return false; 
} 

另外,我将不胜感激有关如何更好地解决此问题的任何建议。我正在使用Apple XCode,它没有包含unordered_map的库。

更容易:

std::set<int> s(vec2.begin(), vec2.end());
return s.size() < vec2.size();

这依赖于std::set不包含重复项的事实。因此,如果向量中有任何重复项,则集合将更小。

如果您担心这会执行太多不必要的复制,则可以使用循环并在第一个重复项时中断:

std::set<int> s;
for (int i : vec2) {
  if (!s.insert(i).second) return true;
}
return false;
std::sort(V.begin(), V.end());
if (std::adjacent_find(V.begin(), V.end()) != V.end()) {
    // found a duplicate
}