我想检查一个整数向量是否有重复,如果有,则必须返回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循环来执行相同的操作,我应该怎么做?
答案 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";
}