C++11 检查向量是否<;int>;包含重复的绝对值

C++11 检查向量是否<;int>;包含重复的绝对值,c++11,vector,C++11,Vector,试图确定向量是否包含重复项。这适用于向量中元素的绝对值。我用几个案例测试了我的实现,结果不一致 bool has_duplicate(vector<int> v) { vector<int>::iterator it; for (it = v.begin(); it != v.end(); ++it) { if (v[*it] < 0) v[*it *= -1; if (count(v.begin(), v.end(), v

试图确定向量是否包含重复项。这适用于向量中元素的绝对值。我用几个案例测试了我的实现,结果不一致

bool has_duplicate(vector<int> v) {
  vector<int>::iterator it;

  for (it = v.begin(); it != v.end(); ++it) {
    if (v[*it] < 0)  
      v[*it *= -1;
    if (count(v.begin(), v.end(), v[*it]) > 1)
      return true;
  }
  return false;
}

vector<int> v1 {1, -1};       // true
vector<int> v3 {3, 4, 5, -3}; // true
vector<int> v2 {2, -2};       // false
vector<int> v4 {3, 4, -3};    // false
vector<int> v5 {-1, 1};       // false
bool有重复(向量v){
向量::迭代器;
for(it=v.begin();it!=v.end();+it){
if(v[*it]<0)
v[*it*=-1;
if(计数(v.begin(),v.end(),v[*it])>1)
返回true;
}
返回false;
}
向量v1{1,-1};//真
向量v3{3,4,5,-3};//真
向量v2{2,-2};//假
向量v4{3,4,-3};//false
向量v5{-1,1};//false

任何关于错误实现的见解都是值得赞赏的

迭代器就像一个指针,而不是一个索引,因此您肯定在代码中误用了它们。它不是为我编译的。看起来您试图搜索向量中的每个元素,而不是其他元素,这是低效的,时间复杂度接近O(N^2)。由于您的函数只想查看是否存在重复项,因此您可以在找到重复项后立即停止。通过使用集合跟踪到目前为止发现的内容,您的时间复杂度更接近O(N*log(N))

bool有重复(向量v)
{
设置s;
对于(自动i=v.begin();i!=v.end();++i){
int ai=绝对值(*i);
如果(s.count(ai))返回true;
s、 插入(ai);
}
返回false;
}

迭代器就像一个指针,而不是一个索引,因此您肯定在代码中误用了它们。它不是为我编译的。看起来您试图搜索向量中的每个元素,而不是其他元素,这是低效的,时间复杂度接近O(N^2)。由于您的函数只想查看是否存在重复项,您可以在找到重复项后立即停止。通过使用集合跟踪到目前为止发现的内容,您的时间复杂度更接近O(N*log(N))

bool有重复(向量v)
{
设置s;
对于(自动i=v.begin();i!=v.end();++i){
int ai=绝对值(*i);
如果(s.count(ai))返回true;
s、 插入(ai);
}
返回false;
}
bool hasdeplicate(std::vector v)
{
std::transform(v.begin(),v.end(),v.begin(),::abs);
排序(v.begin(),v.end());
返回std::相邻的查找(v.begin(),v.end())!=v.end();
}
bool hasdeplicate(std::vector v)
{
std::transform(v.begin(),v.end(),v.begin(),::abs);
排序(v.begin(),v.end());
返回std::相邻的查找(v.begin(),v.end())!=v.end();
}

std::vector中的元素“总是”有整数吗?是的。到目前为止,我只测试了列出的那些情况。
v[*it]
没有任何意义。
*它给了你已经指向的元素。@t.C.你是对的。但是,除此之外,我可能会看到OP有什么问题。我认为函数
count
以一种意外的方式使用了
std::unique
?@DeanSeo-Huh?究竟为什么
std::count
调用
std::unique
?您尝试的std::vector中的元素“总是”有整数吗?是的。到目前为止,我只测试了列出的情况。
v[*it]
没有任何意义。
*它给了你已经指向的元素。@t.C.你是对的。但是,除此之外,我可能会看到OP有什么问题。我认为函数
count
以一种意外的方式使用了
std::unique
?@DeanSeo-Huh?究竟为什么
std::count
调用
std::uniqUE ?你误用<代码>唯一的< /COD> > RTM。关于“代码>相邻的查找< /COD>”,OP想在等式测试中考虑绝对值,因此SORT()和UNIQUE()这里的函数应该使用测试这种方式的谓词。您滥用了代码>唯一的< /COD>。RTM。关于代码>相邻的查找< /COD>如何?OP想要在等式测试中考虑绝对值,因此这里的SoTo()和UNIQUE()函数应该采取测试这种方式的谓词。
bool has_duplicate(vector<int> v)
{
  set<int> s;
  for (auto i = v.begin(); i != v.end(); ++i) {
    int ai = abs(*i);
    if (s.count(ai)) return true;
    s.insert(ai);
  }
  return false;
}
bool hasDuplicate(std::vector<int> v)
{
    std::transform(v.begin(), v.end(), v.begin(), ::abs);
    std::sort(v.begin(), v.end());
    return std::adjacent_find(v.begin(), v.end()) != v.end();
}