2

更新修复

我只想返回数组中唯一条目的数量。该数组包含一个表示 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 个传递的日期(startDateendDate)之间。在这些条件下,我如何获得不同 IP 的数量?

4

4 回答 4

2

使用std::set,它唯一地存储项目并且它是有效的:

std::set<string> ips;

for (int i=0; i<N; i++)
  ips.insert(info[i].IP);

int unique_ips = ips.size();
于 2013-04-16T17:53:35.710 回答
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();
于 2013-04-16T17:52:55.713 回答
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();
于 2013-04-16T17:59:19.813 回答
1

您可以使用 astd::set来跟踪唯一string的 s:

std::set<std::string> mySet ;

对于每次迭代,只需执行以下操作:

mySet.insert( info[i].IP) ;

最后:

return mySet.size() ;
于 2013-04-16T17:51:58.513 回答