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

a を使用して、一意の sstd::setを追跡できます。string

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

反復ごとに次のようにします。

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

そして最後に:

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