Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > быстрый поиск


Автор: g-r-i-n 9.3.2004, 17:06
Коллеги, выручайте!
Моя программа реализована на Java, но узкое место нужно сделать в JNI. Я в нем (в С++) давно уже не трудился и не скоро буду, поэтому, если кому не жалко, черкните пару строк (желательно полностью рабочий класс):
из массива, скажем М, со строками одинаковой длины берется очередное значение и ищется в векторе V (изначально пустом). Если оно там есть, в другом векторе C элемент с этим же индеском инкрементируется. Если нету - новая строка добавляется в V а в С по тому же индексу ставится единица. Например исходные данные:
М: "018723" ; "738495"; "265833"; "738495"; "265833"; "738495";
Результат:
Код
V          С
"018723"  1
"738495"  3
"265833"  2

Порядок элементов значения не имеет.
Заранее благодарен..

P.s. Для меня вся трудность в итераторах и слежении за памятью (кстати массивы - в десятки мегабайт), я в С++ за себя не ручаюсь, потому и отвлекаю вас от дел ратных. Кроме того, из-за скромных размеров я использую компилятор Watcom, что, оказывается, тоже - специфика.
Если кому чего на Яве или J2ME надо будет - с удовольствием поделюсь smile.gif

Автор: Borisff2003 10.3.2004, 07:08
Как предполагается скрещиват С++ и Java?
Если напишешь какие параметры ту хочешь видеть в Функции , то возможно помогу.
Например так пойдет
Просто не совсем понятно что ты подразумеваешь по вектором и массивом
Вот примеры
char* M[];
string M[];
vector<char*> V;
vector<string> V;
int c[];
vector<int> C;
И вобще насколько я понял тебе надо использовать STL.

Автор: g-r-i-n 10.3.2004, 12:34
Привет, Borisff2003
У меня уже Ява и С++ работают (через dll), просто вместо результата стоит заглушка. Смысл такой - приложение получает (либо генерирует, это не важно) массив данных (скорее всего сhar*, string это наверное класс, т.е. он "дороже") размера size, а обработанные данные он в Яву уже не пересылает, они все равно должны храниться в файле, вот оно их и сохраняет там. Ява потом, когда нужно сама эти данные достает. Все уже работает, нужна только функция быстрого поиска в большом наборе данных. Под вектором я понимаю класс, который есть в любом языке программирования, это не что-то особенное, но если это будет любая другая конструкция - ничего страшного, лишь бы потом можно было данные переписать в файл. Просто я так понимаю в С++ удобнее всего использовать упорядоченный вектор или хэш какой-нибудь. Формат записи в файл - нетривиальный, так что я его сам реализую.
В общем главное - это что массив char* [], а результат в любом виде, как удобней и эффективней, главное пару слов по поводу того, как достать потом это правильно и память освободить. И вообще, есть ли в С++ какой нибудь универсальный сборщик мусора, который подошел бы во всех случаях? Понимаю, что С++ это не Ява, но почему бы и нет?..

Автор: Borisff2003 10.3.2004, 13:38
Код
#include <map>
#include <string>
using namespace std;

void Do(char* M[],int Count, map<string,int> &V){

int i;
map<string,int>::iterator p;
for(i=0;i<Count;i++){
 //ищем
 p=V.find(M[i]);
 if(p==V.end()){//не нашли такой
  V.insert(pair<string,int>(M[i],1));
 }
 else{
  p->second++;
 };
}

};


int main(int argc, char* argv[])
{
char *m[]=
{"1234",
"1234",
"1284",
"1734",
"1234",
"1234",
"1284",
"1734",
};
map<string,int> v;
map<string,int>::iterator p;
Do(m,8,v);
//это вывод на экран
for(p=v.begin();p!=v.end();++p)
 printf("%s,  %d\n",p->first.c_str(),p->second);
//p->first.c_str() строка в формате char*
//p->second  счетчик этой строки
return 0;
}



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)