Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не срабатывает поиск по вектору. не фурычит 
:(
    Опции темы
tararataka
Дата 2.9.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Мне нужно найти пару, первое поле которой совпадает с первым полем шаблона. Почему не срабатывает приведённый код? В найденном итераторе всегда оказывается первый элемент.  smile 
Код

#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;
}

PM MAIL   Вверх
azesmcar
Дата 2.9.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



 smile 
знакомься - std::map
PM   Вверх
tararataka
Дата 2.9.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Да знаю я про map,  smile но он мне не подходит.
PM MAIL   Вверх
azesmcar
Дата 2.9.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(tararataka @  2.9.2010,  14:36 Найти цитируемый пост)
Да знаю я про map,  smile но он мне не подходит. 

и чем же?
PM   Вверх
ИванМ
Дата 2.9.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



tararataka, чтобы заработало достаточно изменить строку:
Код

iter = search(ghostS.begin(),ghostS.end(), tempalt, tempalt+1, linksearch);

Другое дело, конечно, что код ужасен.
PM MAIL   Вверх
tararataka
Дата 2.9.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



azesmcar
Цитата
и чем же?

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

А map сортируется только по первому значению, если я хочу по второму, то мне нужно свопнуть пару. Но сделать это нужно так, что-бы она оставалась одной и той же парой. Я х.з. как это сделать.  smile

ИванМ
Цитата
чтобы заработало достаточно изменить строку:

Ох блин, я совсем про это не подумал.  Да, теперь всё корректно. smile 

Цитата

Другое дело, конечно, что код ужасен. 

Эээ.  smile Почему это ужасен? 
PM MAIL   Вверх
ИванМ
Дата 2.9.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Цитата(tararataka @  2.9.2010,  15:18 Найти цитируемый пост)
Эээ.  smile Почему это ужасен?  

1. использование vector не по назначению
Цитата(tararataka @  2.9.2010,  15:18 Найти цитируемый пост)
нужно постоянно добавлять элементы в него

В vector'е при таких манипуляциях будет происходить перезапись элементов. Лучше использовать list - как раз для таких целей.
2. использование алгоритмов не по назначению - для вашей цели подошел бы find_if.
3. лучше вообще отказаться от указателей (при динамическом выделении памяти), используйте "умные" указатели (а в вашем случае можно вообще использовать статические данные), а если уж вы это делаете, то привыкайте освобождать выделенную память - вы этого не делаете
4. не очень важно, но все же: многоуровневые шаблоны - не читабельно и плохой стиль программирования
Используйте классы или typedef

Это сообщение отредактировал(а) ИванМ - 2.9.2010, 16:20
PM MAIL   Вверх
tararataka
  Дата 2.9.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Цитата

2. использование алгоритмов не по назначению - для вашей цели подошел бы find.

В find нельзя передать собственный предикат, а мне он нужен, так как у меня равные элементы не те, которые полностью равны, а у которых совпадает только часть first.

Цитата

а в вашем случае можно вообще использовать статические данные

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

Цитата

привыкайте освобождать выделенную память - вы этого не делаете

Типа если я свои вектора указателей снесу, то на что они ранее указывали останется? 

Цитата
используйте "умные" указател

Первый раз слышу, надо погуглить.

Это сообщение отредактировал(а) tararataka - 2.9.2010, 16:23
PM MAIL   Вверх
ИванМ
Дата 2.9.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Цитата(tararataka @  2.9.2010,  16:22 Найти цитируемый пост)
В find нельзя передать собственный предикат

Вы быстро ответили.. Я изменил find на find_if

Цитата(tararataka @  2.9.2010,  16:22 Найти цитируемый пост)
Забыл написать, мне нужно изменять значения некоторых элементов.

Это можно делать и со статическими элементами (статические - я имел ввиду, которые без new).

Цитата(tararataka @  2.9.2010,  16:22 Найти цитируемый пост)
Типа если я свои вектора указателей снесу, то на что они ранее указывали останется?

Да

Цитата(tararataka @  2.9.2010,  16:22 Найти цитируемый пост)
используйте "умные" указател
Первый раз слышу, надо погуглить.

Правильно. И советую сразу которые в boost - shared_ptr и ему подобные. auto_ptr не рекомендую, т.к. его нельзя использовать в контейнерах.

Это сообщение отредактировал(а) ИванМ - 2.9.2010, 16:31
PM MAIL   Вверх
tararataka
Дата 3.9.2010, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



ИванМ
Цитата

Я изменил find на find_if

В find_if нельзя передавать шаблон поиска. smile
Код

template <class InputIterator, class Predicate>
   InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred );


Цитата

Это можно делать и со статическими элементами (статические - я имел ввиду, которые без new).

Так их же вроде нельзя создать неопределённое количество?
PM MAIL   Вверх
mrbrooks
Дата 3.9.2010, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(tararataka @  3.9.2010,  09:02 Найти цитируемый пост)
В find_if нельзя передавать шаблон поиска. 

не совсем понятно о чем это ты? почему не устраивает предикат?
Цитата(ИванМ @  2.9.2010,  17:30 Найти цитируемый пост)
Правильно. И советую сразу которые в boost - shared_ptr и ему подобные. auto_ptr не рекомендую, т.к. его нельзя использовать в контейнерах.

если компилятор поддерживает tr1 - то в нем это уже есть.
PM MAIL   Вверх
tararataka
Дата 3.9.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



mrbrooks
Цитата

не совсем понятно о чем это ты? почему не устраивает предикат?

Потому что шаблоны поиска у меня разные, ну всмысле, я наперёд не знаю что буду искать. А передавать что-либо в функцию не через её аргументы - не кошерно.
PM MAIL   Вверх
tararataka
Дата 3.9.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



fix Ой, в предикат тоже можно передать значение. 
PM MAIL   Вверх
Леопольд
Дата 3.9.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(tararataka @  2.9.2010,  15:18 Найти цитируемый пост)
Короче мне нужно иметь один контейнер отсортированным различным образом, плюс нужно постоянно добавлять элементы в него. Ну и что-бы не извращаться, я решил все операции выполнять на различных контейнерах, состоящих из ссылок на одни  и те-же элементы.
Т.е. хранить в других контейнерах итераторы того, где лежат инстансы? Для вектора это неудачная идея, он может переаллоцировать память и старые итераторы станут невалидными.


Это сообщение отредактировал(а) Леопольд - 3.9.2010, 14:48


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
ИванМ
Дата 6.9.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Цитата(tararataka @  3.9.2010,  08:02 Найти цитируемый пост)
Так их же вроде нельзя создать неопределённое количество? 

Нельзя точно также как и динамические. Грубо говоря, элементы, переданные в контейнер, будут по-любому динамическими. Будут храниться в выделенной памяти.

Цитата(mrbrooks @  3.9.2010,  08:13 Найти цитируемый пост)
если компилятор поддерживает tr1 - то в нем это уже есть. 

Я в основном на VS2008. Читал, что tr1 там есть, но я его не смог найти.

Это сообщение отредактировал(а) ИванМ - 6.9.2010, 11:24
PM MAIL   Вверх
tararataka
Дата 7.9.2010, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



А я могу с помощью дебаггера найти участки памяти, на которые ничто не указывает?

Это сообщение отредактировал(а) tararataka - 7.9.2010, 06:50
PM MAIL   Вверх
Леопольд
Дата 7.9.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



tararataka, если речь про утечки памяти, то, вроде, valgrind может помочь.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.