2013-04-16 2 views
2

ОБНОВЛЕНО С 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(); 

} 

Первый, если проверяет, поддерживает ли соответствующий URL на самом деле матч, и dateChecker просто убеждается, что дата, когда конкретный IP-адрес отправился на этот URL, находится между двумя прошедшими датами (startDate и endDate). Как я могу получить количество разных IP-адресов в этих условиях?

+0

Вы не должны изменять исходный вопрос с помощью исправления, иначе читатели, которые приходят позже, не поймут, что произошло. В общем, вы хотите добавить раздел редактирования в конец своего вопроса. –

+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(); 
+0

извините, что IP-адреса являются переменными класса Object (info [i] .IP) – Sherifftwinkie

+0

Wow я никогда не слышал об этом. Таким образом, в основном это структура данных, которая будет хранить только одно происхождение каждой различной строки или типа данных, которые вы бросаете на него. Поэтому, если я использовал его для ints, и я добавил как {1, 1, 6, 6, 4, 1, 15}. Он просто сохранит 1, 6, 4 и 15? – Sherifftwinkie

+0

Да, точно. Вы поняли. – deepmax

1

Вы можете использовать std::set отслеживать уникальных string с:

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

для каждой итерации просто сделать:

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

и в конце:

return mySet.size() ; 
1

You может сделать это лениво с помощью набора

std::set<string> uniq; 
if(url == info[i].URL && (dateChecker(startDate, endDate, info[i].dateAccessed))){ 
     uniq.insert(info[i].URL); 
} 

return uniq.size(); 
1

Как уже упоминалось вам нужно использовать станд :: установить, однако нет необходимости вручную итерация массива, так как станд :: карта принимает итераторы в диапазон, из которых он должен быть построен. Таким образом,

std::map<std::string> unique(strinvec.begin(), stringvec.end()); 

Следует сделать трюк.
И если вам нужно знать только количество уникальных элементов, вы можете использовать еще более короткие обозначения.

size_t unique_count = std::map<std::string>(strinvec.begin(), stringvec.end()).size(); 
Смежные вопросы