Форум программистов, компьютерный форум CyberForum.ru

Итераторы, как аргументы функции - C++

Восстановить пароль Регистрация
 
4iFF
 Аватар для 4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
19.08.2012, 00:04     Итераторы, как аргументы функции #1
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
#include <string>
using std::string;
 
void setPrintIter(string::const_iterator, string);
string::const_iterator getPrintIter(string::const_iterator, string);
 
int main(){
    string string1;
 
    cout << "Enter string:";
    getline(cin,string1);
 
    string::const_iterator iter = string1.end() - 1;//т.к. string1.end() символ за последним
 
    /*
    for (;;){
        cout << *iter;
        if (iter == string1.begin())   //рабочее (не рекурсивное) решение 
            break;
        iter--;
    }*/
 
    cout << *getPrintIter(iter,string1) << endl;
    setPrintIter(iter,string1);
 
    return 0;
}
 
void setPrintIter(string::const_iterator it, string str){
    if (it == str.begin())
        cout << *it;
    else{
        cout << *it;
        setPrintIter(it--,str);
    }
}
 
string::const_iterator getPrintIter(string::const_iterator it, string str){
    if (it == str.begin())
        return it;
    else
        return getPrintIter(it--,str);
}
Задача:
вывести строку в обратном порядке, используя итераторы,не рекурсивно и рекурсивно.
Проблема:
Не рекурсивный метод я написал, а вот set и get рекурсивные варианты не работают и во время выполнения программы выдает 2 ошибки (одинаковы при вызовах set и get функций):
1)string iterators incompitible (во время написания не рекурсивного варианта заметил что это выдает когда итерат выходит за предел)
2)"Standart C++ Libraries Invalid Argument" && 0 (неужели функции не могут иметь в качестве аргументов итераты?!)
Вопрос:
В чем тут ошибка\ки?Могут ли функции иметь в качестве аргументов итераты?

Заранее спасибо за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2012, 00:04     Итераторы, как аргументы функции
Посмотрите здесь:

Аргументы функции C++
C++ Аргументы функции
Аргументы у функции C++
C++ Аргументы Функции
C++ Аргументы функции: что значит "большие" и "небольшие" аргументы?
Итераторы в шаблонной функции C++
Аргументы функции C++
Как задать параметры запуска (аргументы командной строки) функции main? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
19.08.2012, 00:29     Итераторы, как аргументы функции #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//---------------------------------------------------------------------------
template <class Iter>
void print(Iter first,Iter last)
{
 while(first != last)
  {
    std::cout<< *first<<" ";
    ++first;
  }
}
//---------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
using namespace std;
 
int a[]={1,2,3,4,5} ;
vector<int> va(a,a+5);
 
print(va.rbegin(),va.rend() ); cout<<endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Если писать то думаю в стиле алгоритмов
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
19.08.2012, 00:45     Итераторы, как аргументы функции #3
Рекурсивно, в обратном порядке, в стиле алгоритмов STL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
template < class ForwardIterator >
void recursivePrint( ForwardIterator first, ForwardIterator last )
{
    if ( first != last )
    {
        std::cout << *last;
        recursivePrint( first, --last );
    }
}
 
int main( int argc, char **argv )
{
    std::string str( "This is string!" );
    recursivePrint( str.begin(), str.end() - 1 );
    return 0;
}
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
19.08.2012, 00:49     Итераторы, как аргументы функции #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
template <class Iter>
void reverse_print(Iter first,Iter last)
{
 --last;
 while(last >= first)
  {
    std::cout<< *last<<" ";
    --last;
  }
}
//---------------------------------------------------------------------------
template <class Iter>
void recurs_reverse_print(Iter first,Iter last)
{
 if(first!=last)
  {
   reverse_print(first+1,last);
   std::cout<< *first<<" ";
  }
}
//---------------------------------------------------------------------------
Ну это все извращения по сути...
4iFF
 Аватар для 4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
19.08.2012, 12:24  [ТС]     Итераторы, как аргументы функции #5
C++
1
2
3
4
5
6
7
8
9
10
11
template < class ForwardIterator >
void recursivePrint( ForwardIterator first, ForwardIterator last )
{   
    if ( first == last )
       std::cout << *last;
    else  if ( first != last )
    {
        std::cout << *last;
        recursivePrint( first, --last );
    }
}
Mиxaил, только вот так, т.к. первый символ не выводит.
Yandex
Объявления
19.08.2012, 12:24     Итераторы, как аргументы функции
Ответ Создать тему
Опции темы

Текущее время: 19:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru