数组中字符串的数量不同

时间:2013-04-16 17:48:59

标签: c++ arrays count distinct

更新为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个传递日期之间(startDateendDate)。如何在这些条件下获得不同IP的数量?

4 个答案:

答案 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();