更新为FIX
我想只返回数组中唯一条目的数量。该数组包含一个表示IP地址的字符串变量。如果有10个,但有3种不同我只想返回3.我整天都在这里,似乎无法找到有效的解决方案。我的代码:
原始代码
int getUnique(Visitors info[], string url, string startDate, string endDate){
int count = 0;
string temp;
for(int i = 0 ; i < N ; i++){
if(url == info[i].URL && (dateChecker(startDate, endDate, info[i].dateAccessed))){
}
}
return count;
}
更新了代码
int getUnique(Visitors info[], string url, string startDate, string endDate){
set<string> ips;
for(int i = 0 ; i < N ; i++){
if(url == info[i].URL && (dateChecker(startDate, endDate, info[i].dateAccessed))){
ips.insert(info[i].IP);
}
}
return ips.size();
}
第一个if检查匹配的URL是否确实匹配,而dateChecker
只是确保特定IP到达该URL的日期介于2个传递日期之间(startDate
和endDate
)。如何在这些条件下获得不同IP的数量?
答案 0 :(得分:2)
使用std::set
,它会唯一地存储项目并且效率很高:
std::set<string> ips;
for (int i=0; i<N; i++)
ips.insert(info[i].IP);
int unique_ips = ips.size();
答案 1 :(得分:1)
您可以使用std::set
来跟踪唯一的string
:
std::set<std::string> mySet ;
每次迭代只需:
mySet.insert( info[i].IP) ;
最后:
return mySet.size() ;
答案 2 :(得分:1)
您可以使用set
懒惰地执行此操作std::set<string> uniq;
if(url == info[i].URL && (dateChecker(startDate, endDate, info[i].dateAccessed))){
uniq.insert(info[i].URL);
}
return uniq.size();
答案 3 :(得分:1)
正如已经提到的,你需要使用std :: set,但是不需要手动迭代数组,因为std :: map接受迭代器到它应该构造的范围。因此
std::map<std::string> unique(strinvec.begin(), stringvec.end());
应该做的伎俩 如果您只需要知道唯一元素的数量,您可以使用更短的符号。
size_t unique_count = std::map<std::string>(strinvec.begin(), stringvec.end()).size();