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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с find и const_iterator 
V
    Опции темы
v_123
Дата 9.3.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите, пожалуйста, почему в следующем коде i=find(in.begin(),in.end(),buf[0]); работает 
а при попытке использовать вместо in.begin() итератор, в данном случае  string::const_iterator SI i;
компилятор выводит ошибку?
Как ее устранить?

Код

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string buf="az";
string in="axsdassazd";

typedef string::const_iterator SI;
    

int main ()
{    
    SI i;

    i=find(in.begin(),in.end(),buf[0]); // ошибки нет
    i=find(i,in.end(),buf[0]); // ошибка
    
            return 0;
}


Ошибка: 
d:\Program Files\Microsoft Visual Studio\MyProjects\1\4_11\5_12(2).cpp(16) : error C2782: '_II __cdecl std::find(_II,_II,const _Ty &)' : template parameter '_II' is ambiguous
        could be 'char *'
        or       'const char *'

аналогично при использовании sort, count.
PM MAIL   Вверх
archimed7592
Дата 9.3.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(v_123 @  9.3.2008,  16:56 Найти цитируемый пост)
Как ее устранить?

Код

i=find(i,SI(in.end()),buf[0]);
// либо
i = find< SI >(i, in.end(), buf[0]);



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
v_123
Дата 9.3.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



При использовании любого из них: 
Код

i=find(i,SI(in.end()),buf[0]); // либо i = find< SI >(i, in.end(), buf[0]);

виндоус выдает ошибку:

4_11.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства. и т.д



PM MAIL   Вверх
archimed7592
Дата 9.3.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Это уже не в const_iterator дело, а в неправильном его использовании.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
v_123
Дата 9.3.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



и еще, пример похож на приведенный в Страуструпе п.3.8.1 и там не написано о подобных проблемах
у него:
Код

...
char c;
int n=0;
...
string::const_iterator i=find(s.begin(),s.end(),c);
while (i!=s.end()){
     ++n
      i=find(i+1),s.end(),c);
}
...


Добавлено через 3 минуты и 17 секунд
Цитата

Это уже не в const_iterator дело, а в неправильном его использовании.

Вы не объясните более подробно в чем тут дело?
PM MAIL   Вверх
archimed7592
Дата 9.3.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(v_123 @  9.3.2008,  17:59 Найти цитируемый пост)
Вы не объясните более подробно в чем тут дело? 

По приведённому кусочку кода сказать сложно. Скорее всего причина AV(access violation), т.е. обращение к области памяти, к которой ты обращаться права не имеешь.

Изначальная проблема была связана с тем, что компилятор не мог вывести один из шаблонных параметров ф-ции и, с "ошибкой windows" это никак не связано.

Цитата(v_123 @  9.3.2008,  17:59 Найти цитируемый пост)
и там не написано о подобных проблемах

Думаю что, если перепечатать пример букву в букву, то "ошибки windows" не будет - потому там "о подобных проблемах" и не написано.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
comcon1
Дата 10.3.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



хм... риальне не работе))

гыгыгы. ну begin() возвращает просто string::iterator. поэтому с .begin(), .end() усе работает. Даже не знаю, как понимать такой прикол.

Это сообщение отредактировал(а) comcon1 - 10.3.2008, 11:23


--------------------
PM MAIL   Вверх
archimed7592
Дата 10.3.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(comcon1 @  10.3.2008,  11:10 Найти цитируемый пост)
хм... риальне не работе))


Цитата(archimed7592 @  9.3.2008,  22:51 Найти цитируемый пост)
Изначальная проблема была связана с тем, что компилятор не мог вывести один из шаблонных параметров ф-ции




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
comcon1
Дата 10.3.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



содержание STL-книги. теперь все ясно.)))
Цитата

Глава 4 Итераторы
Совет 26. Старайтесь использовать iterator вместо const_iterator, reverse_iterator и const_reverse_iterator
Совет 27. Используйте distance и advance для преобразования const_iterator в iterator
Совет 28. Научитесь использовать функцию base
Совет 29. Рассмотрите возможность использования istreambuf_iterator при посимвольном вводе


Код

#include <iostream>
#include <string>
#include <algorithm>
// using namespace std; вот это убираем

using std::string;

string buf("az"); // "предпочитайте инициализацию присваиванию"
string in("axsdassazd");

  

int main ()
{    
    string::const_iterator i(find(in.begin(),in.end(),buf[0])); // ошибки нет
    std::cout << *(++i);
    std::cout << *(++i);
    int j = std::distance(string::const_iterator(in.begin()),i);
    string::iterator p = in.begin(); 
    std::advance(p,j);
    std::find(p,in.end(),buf[0]); // ошибка
    
    return 0;


}


вот такая херь работает уже норм. но это, простите, извращенство!!

Это сообщение отредактировал(а) comcon1 - 10.3.2008, 11:43


--------------------
PM MAIL   Вверх
v_123
Дата 10.3.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за ответы. Решение проблемы в принципе найдено. Вариант comcon1 работает.
Тот который в книге в исходном варианте все таки не заработал, но с
 i = std::find< SI >(i+1, s.end(), c);  ошибок нет.

Код

#include <iostream>
#include <string>
#include <algorithm>
typedef std::string::const_iterator SI;

int main()
{
    char c='a';
    std::string s("aaasssaasd");
    int n=0;
    std::string::const_iterator i=std::find(s.begin(),s.end(),c);
    while (i!=s.end()){
        ++n;
        i=std::find(i+1,s.end(),c); // по прежнему ошибка (изначальная)
        i = std::find< SI >(i+1, s.end(), c); //ошибки нет
    }
    return 0;
}    


Ошибка: 
d:\Program Files\Microsoft Visual Studio\MyProjects\1\4_11\5_12(2).cpp(16) : error C2782: '_II __cdecl std::find(_II,_II,const _Ty &)' : template parameter '_II' is ambiguous
        could be 'char *'
        or       'const char *'
PM MAIL   Вверх
archimed7592
Дата 11.3.2008, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(comcon1 @  10.3.2008,  11:36 Найти цитируемый пост)
Совет 26. Старайтесь использовать iterator вместо const_iterator, reverse_iterator и const_reverse_iterator

Хотел бы я увидеть аргументацию Мейрса(??) отностиельно данного совета(если он [совет], конечно, правильно перепечатан).

Цитата(comcon1 @  10.3.2008,  11:36 Найти цитируемый пост)
вот такая херь работает уже норм. но это, простите, извращенство!!

Кто ж виноват, что Вы извращенец...

Цитата(v_123 @  10.3.2008,  22:33 Найти цитируемый пост)
i=std::find(i+1,s.end(),c); // по прежнему ошибка (изначальная)

Действительно, если ничего в коде не менять, то ошибки(изначальные) в нём по прежнему останутся.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 11.3.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



может лучше использовать не std::find, а std::string::find?
PM   Вверх
JackYF
Дата 11.3.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  11.3.2008,  05:55 Найти цитируемый пост)
Хотел бы я увидеть аргументацию Мейрса(??) отностиельно данного совета

ЕМНИП, то, что многие алгоритмы работают только с iterator (хотя корней этого факта я не помню)


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 11.3.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(JackYF @  11.3.2008,  18:12 Найти цитируемый пост)
ЕМНИП, то, что многие алгоритмы работают только с iterator (хотя корней этого факта я не помню) 

Это не аргумент. Когда мне нужен поиск по коллекции(non modifying algorithm), я могу свободно пользоваться const_iterator. Имею право так сказать(а следуя хорошему тону именно должен - не зря в С++09 вводят метод cbegin созвращающий const_iterator).
Когда же мне нужно отсортировать коллекцию, я использую sort(modifying algorithm), который просто не примет const_iterator.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
comcon1
Дата 11.3.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Цитата

Кто ж виноват, что Вы извращенец...

Я не извращенец, я риальне не юзаю const_iterator в реальном коде. Я воспользовался советом Мейрса, который дословно скопипастил с какого-то сайта. Может подскажете менее извращенный способ перевода const_iterator в iterator. Этот пример п.к.м. работает...


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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