检查std :: vector有重复项

时间:2017-09-28 20:27:40

标签: c++ algorithm for-loop vector duplicates

我想检查一个整数向量是否有重复,如果有,则必须返回true。所以我尝试做这样的事情:

before((done) => {
        modelDef.TaskListItemModel.TaskListItem.query().del()
            .then(() => {
                modelDef.TaskListModel.TaskList.query().del()
                    .then(() => {
                        modelDef.ProductAnomalyModel.ProductAnomaly.query().del()
                            .then(() => {
                                modelDef.ProductModel.Product.query().del()
                                    .then(() => {
                                        modelDef.UserModel.User.query().del()
                                            .then(() => {
                                                modelDef.UserModel.User.forge(test_User)
                                                    .save()
                                                    .then((result) => {
                                                        test_User.id = result.get('id');
                                                        test_ProductAnomaly.createdBy = test_User.id;
                                                        test_TaskList.createdBy = test_User.id;

                                                        return modelDef.ProductModel.Product.forge(test_Product)
                                                            .save();
                                                    })
                                                    .then((result) => {
                                                        test_Product.id = result.get('id');
                                                        test_ProductAnomaly.ProductId = test_Product.id;

                                                        return modelDef.ProductAnomalyModel.ProductAnomaly.forge(test_ProductAnomaly)
                                                            .save();
                                                    })
                                                    .then((result) => {
                                                        test_ProductAnomaly.id = result.get('id');
                                                        test_TaskListItem.ProductAnomalyId = test_ProductAnomaly.id;

                                                        return modelDef.TaskListModel.TaskList.forge(test_TaskList)
                                                            .save();
                                                    })
                                                    .then((result) => {
                                                        test_TaskListItem.tasklistId = result.get('id');

                                                        return modelDef.TaskListItemModel.TaskListItem.forge(test_TaskListItem)
                                                            .save();
                                                    })
                                                    .then(done);
                                            })
                                    })
                            })
                    })
            });

    });

这不起作用,因为unqiue不能被指定为bool值。 我该怎么办呢? 如果我要写一个for循环来执行相同的操作,我应该怎么做?

6 个答案:

答案 0 :(得分:8)

在google中查找vector<int>::iterator it = std::unique( a.begin(), a.end() ); bool wasUnique = (it == a.end() ); 我找到了此页面cplusplus : unique。我在看 a)它做了什么

  

删除每个连续组中除第一个元素外的所有元素

所以它看起来像你想要的那样 - 删除重复项。

然后我看看它返回什么,以及一些评论,遇到问题......

  

返回值:最后一个元素后面元素的迭代器。

因此,unique的结果是一个不必与整个向量相同的序列。

如果没有删除任何内容,则返回值将是向量的结尾。

所以

auto it = std::unique( a.begin(), a.end() );
bool wasUnique = (it == a.end() );

或者对于C ++ 11

sort(a.begin(), a.end());

最后,为了使用唯一函数,需要对向量进行排序,因此完整的代码将包括

sort(a.begin(), a.end());
auto it = std::unique( a.begin(), a.end() );
bool wasUnique = (it == a.end() );

e.g。

java.lang.UnsatisfiedLinkError: ars3wapi32 (Not found in java.library.path)
  java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:1007)
  java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:971)
  java.lang.System.loadLibrary(System.java:470)
  com.ibm.edms.od.ArsWWWInterface.<clinit>(ArsWWWInterface.java:15)
  java.lang.J9VMInternals.initializeImpl(Native Method)
  java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
  com.ibm.edms.od.ODServer.<init>(ODServer.java:45)
  com.ibm.edms.od.ODServer.<init>(ODServer.java:61)
  com.uklife.web.ondemand.utils.DownloadUtils.getAFPDocumentFromOnDemand(DownloadUtils.java:80)
  com.uklife.web.ondemand.utils.Utils.getDocument(Utils.java:288)
  com.uklife.web.ondemand.servlet.OnDemandDocAccess.doGet(OnDemandDocAccess.java:81)
  javax.servlet.http.HttpServlet.s`enter code here`ervice(HttpServlet.java:621)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:722

答案 1 :(得分:2)

如果有人被迫编写自己的算法:

bool hasDuplicates(const std::vector<int>& arr) {
    for (std::size_t i = 0; i < arr.size(); ++i) {
        for (std::size_t j = i + 1; j < arr.size(); ++j) {
            if (arr[i] == arr[j])
                return true;
        }
    }
    return false;
}

但在实际代码中,您应该使用已经存在的东西,并使用标准库。

答案 2 :(得分:2)

使用std::unique(),如下所示:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {1,2,3,3,4,5};
    auto it = std::unique(v.begin(), v.end());
    std::cout << ((it == v.end()) ? "Unique\n" : "Duplicate(s)\n");
    return 0;
}

输出:

  

重复的(S)

答案 3 :(得分:0)

您要寻找的算法是std::adjacent_find

// The container must be sorted!
const std::vector<int> sortedVector = {1,2,3,3,4,5};
const bool hasDuplicates = std::adjacent_find(sortedVector.begin(), sortedVector.end()) != sortedVector.end();

与std :: unique不同,std :: adjacent_find不会修改容器。

作为奖励,std :: adjacent_find将迭代器返回到重复的“对”中的第一个元素:

const auto duplicate = std::adjacent_find(sortedVector.begin(), sortedVector.end());
if (duplicate != sortedVector.end())
    std::cout << "Duplicate element = " << *duplicate << "\n";

答案 4 :(得分:0)

您应该使用set

set<int> s(a.begin(), a.end());
return s.size() != a.size();

答案 5 :(得分:-1)

到目前为止,所有这些解决方案都要么修改容器,要么具有O(n²)的复杂性。你可以更好地使用std :: map:

#include <algorithm>
#include <iterator>
#include <map>

template <typename Iterator>
bool has_duplicates( Iterator first, Iterator last )
{
  std::map <typename std::iterator_traits <Iterator> ::value_type, std::size_t> histogram;

  while (first != last)
    if (++histogram[ *first++ ] > 1) 
      return true;

  return false;
}

#include <iostream>
#include <vector>

int main()
{
  using std::begin;
  using std::end;

  int a[] = { 2, 3, 5, 7, 11 };
  int b[] = { 2, 3, 5, 5, 7 };

  std::vector <int> c( begin(a), end(a) );
  std::vector <int> d( begin(b), end(b) );

  std::cout << std::boolalpha;
  std::cout << "a has duplicates false : " << has_duplicates( begin(a), end(a) ) << "\n";
  std::cout << "b has duplicates true  : " << has_duplicates( begin(b), end(b) ) << "\n";
  std::cout << "c has duplicates false : " << has_duplicates( begin(c), end(c) ) << "\n";
  std::cout << "d has duplicates true  : " << has_duplicates( begin(d), end(d) ) << "\n";
}