Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2010, 17:30   #1
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию алгоритм search, поиск в векторе ссылочных переменных

Я в этом векторе:
vector< pair<string, int >* > ghostS;

пытаюсь искать:
iter = search(ghostS.begin(),ghostS.end(), tempalt, tempalt, linksearch);


Вопрос в том, каким должен быть предикат?(я с ним как только не извращался, но ничего не вышло)
bool linksearch(pair<string, int> a, pair<string, int> b) {
return ((a.first) == (b.first));
}



Код:
#include<iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool linksearch(pair<string, int> a, pair<string, int> b) {
return ((a.first) == (b.first));
}

int main() {
    
	vector< pair<string, int >* > ghostS;                       // создание контейнера
	vector< pair<string, int > >::iterator iter; 
	ghostS.push_back(new pair<string, int>("River", 1) );       // инициализация
	
	pair<string, int> * tempalt = new pair<string, int>("River", 1); // шаблон для поиска
			
	iter = search(ghostS.begin(),ghostS.end(), tempalt, tempalt, linksearch);
	cout << iter->first <<endl;
	
    return 0;
}

Последний раз редактировалось the_deer_one; 01.09.2010 в 17:33.
the_deer_one вне форума Ответить с цитированием
Старый 01.09.2010, 17:40   #2
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

посмотрите внимательнее на ваш код. У вас вектор типа
Код:
vector<pair<string, int>*>
а все остальное
Код:
vector<pair<string, int>>
sashonk вне форума Ответить с цитированием
Старый 01.09.2010, 17:43   #3
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Ага, я в итераторе звёздочку забыл. Тем не менее вопрос остаётся. У меня не получается linksearch корректно написать.
the_deer_one вне форума Ответить с цитированием
Старый 01.09.2010, 17:51   #4
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Код:
bool linksearch(pair<string, int>* a, pair<string, int>* b) {
return ((a->first) == (b->first));}
sashonk вне форума Ответить с цитированием
Старый 01.09.2010, 17:55   #5
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

sashonk
Я пробовал такое - не работает. Во всяком случае у меня компилятор тучу ошибок выдаёт.

Ты со своим вариантом функции программу собрать пробовал, или просто написал?
the_deer_one вне форума Ответить с цитированием
Старый 01.09.2010, 18:10   #6
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

ерунда какая-то...у меня работает в таком формате
Код:
bool linksearch(pair<string, int>* a, pair<string, int> b) {
return ((a->first) == (b.first));
}
int main() {
	vector< pair<string, int >* > ghostS;                      
	vector< pair<string, int >* >::iterator iter; 
	ghostS.push_back(new pair<string, int>("River", 1) );       // 
	pair<string, int> * tempalt = new pair<string, int>("River", 1); // 	
	iter = search(ghostS.begin(),ghostS.end(), tempalt, tempalt, linksearch);	
	cout << (*iter)->first <<endl;	
    return 0;
}
пока не соображу в чем дело.
sashonk вне форума Ответить с цитированием
Старый 01.09.2010, 19:50   #7
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Во!! Точно. Такой вариант я точно пробовал, но у меня судя по всему из-за ошибки в типе оператора не сработало.

Цитата:
пока не соображу в чем дело.
А чё там соображать то? Так уж она устроена, что требует итераторы на то, где ищет, и ссылку на то, что ищет. Ну и вот автоматом их разыменовывает. Но поскольку у меня массив указателей, то его приходится разыменовывать дополнительно. А второе значение - это шаблон поиска, он уже разыменован.
the_deer_one вне форума Ответить с цитированием
Старый 02.09.2010, 10:47   #8
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

функция search принимает в качестве аргументов итераторы, а вы ей передаете указатель (tempalt), поэтому она себя и ведет непонятно. И потом она предназначена для поиска в последовательности подпоследовательности, т.е. это интервальная функция. А для поиска одного элемента пользуются функцией find. Потом, мне кажется, использовать шаблон pair в виде указателя в принципе не очень хорошая практика. Лучше юзать объект и использовать шаблонную функцию make_pair(arg1, arg2). Что касается вашей задачи, мне кажется, лучше подойдет контейнер map с возможностью поиска по ключу
sashonk вне форума Ответить с цитированием
Старый 02.09.2010, 11:09   #9
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

sashonk
Цитата:
А для поиска одного элемента пользуются функцией find.
Насколько я понял. В find нельзя передавать собственный предикат. А нужен он мне для того, что равными у меня считаются объекты не с полностью совпадающими элементами, а те у которых равно значение first.

Цитата:
Лучше юзать объект и использовать шаблонную функцию make_pair(arg1, arg2).
Про make pair не знал. Но это просто сокращение. И она же возвращает не указатель на пару.

Цитата:
Что касается вашей задачи, мне кажется, лучше подойдет контейнер map с возможностью поиска по ключу
Мне нужно иметь один контейнер отсортированным разными способами. Причём в него будут постоянно вноситься элементы.
Что-бы не плодить сущностей и не извращаться, я просто решил сделать нужное мне количество контейнеров, по факту элементы которых указывают на одни объекты. Таким образом и данные не клонируются, и изменения вносятся во всё разом.

Впрочем если есть более хороший вариант, я буду рад про него узнать.
the_deer_one вне форума Ответить с цитированием
Старый 02.09.2010, 15:15   #10
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

sashonk
Цитата:
у меня работает в таком формате
НЕЕЕЕТ, оно так не работает, это просто самый первый итератор, если искать последнее слово, то всё равно в итераторе будет первый элемент:

Код:
#include<iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool linksearch(pair<string, int>* a, pair<string, int> b) {
return ((a->first) == (b.first));
}

int main() {
        vector< pair<string, int >* > ghostS;
        vector< pair<string, int >* >::iterator iter;
        ghostS.push_back(new pair<string, int>("River", 1) );       //
        ghostS.push_back(new pair<string, int>("long", 1) );       //
        ghostS.push_back(new pair<string, int>("Belive", 1) );       //

        pair<string, int> * tempalt = new pair<string, int>("Belive", 1); //
        iter = search(ghostS.begin(),ghostS.end(), tempalt, tempalt, linksearch);
        cout << (*iter)->first <<endl;
        system("PAUSE");
    return 0;
}
the_deer_one вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в векторе. the_deer_one Общие вопросы C/C++ 3 31.08.2010 17:52
Вычислить сумму всех четных чисел в векторе malova Microsoft Office Excel 2 31.05.2010 09:09
Уничтожение ссылочных массивов. jojahti Общие вопросы C/C++ 2 22.08.2009 01:03
Алгоритм поиск текста Des Общие вопросы Delphi 5 27.04.2009 22:01