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

Как вывести номер итератора в стандартный поток cout - C++

Восстановить пароль Регистрация
 
AnreyKazakov
Заблокирован
09.09.2012, 13:06     Как вывести номер итератора в стандартный поток cout #1
Есть пример решенный.
Там необходимо ввести числа, cin их считывает и заносит в вектор, каждое как отдельный элемент, при выходе их надо объединить (суммировать) 1 со 2, 3 с 4 и т.д. если нет пары выводит что пары у последнего элемента нет...
В связи с этим вопрос как-то можно номер итератора вывести на экран пробовал в стандартный поток выхода cout но у меня так даже не компелируется, зависает все и вся (я выделил комментарием этот фрагмент)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
int main(void){
    using std::cout;
    using std::cin;
    using std::endl;
    using std::vector;
    int val;
    vector<int> vec;
    while(cin>>val)vec.push_back(val);//тут в вектор слова забиваются
    int k=0;
    val=0;
    for(vector<int>::iterator iter=vec.begin();iter!=vec.end();++iter){
        ++k;                          //счетчик перебора всех элементов вектора
        val+=*iter;
        if(k==2){
            k=0;
            cout<</*"Sum of vec["<<iter-1<<"] and vec["<<iter<<"] is "<<*/val<<endl;
            val=0;}
        }
    if(k==1)cout<</*"Vec["<<iter-1<<"] is no pair. His value"<<*/val<<endl;
    return 0;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 13:06     Как вывести номер итератора в стандартный поток cout
Посмотрите здесь:

C++ Как вывести переменную string через cout?
C++ Как вывести символ бесконечности(∞) в консоли с помощью cout
Где определён стандартный поток stdin? C++
C++ Стандартный входной поток
Как вывести обьект с cout ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
09.09.2012, 13:28     Как вывести номер итератора в стандартный поток cout #2
Что-то типа этого?
C++
1
iter - vec.begin()
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.09.2012, 13:33     Как вывести номер итератора в стандартный поток cout #3
Более универсально
C++
1
std::distance(vec.begin(), iter);
Только надо не забывать, что, к примеру, у списков эта операция будет выполняться с линейной сложностью (довольно медленно).
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
09.09.2012, 14:39     Как вывести номер итератора в стандартный поток cout #4
Mиxaил, боюсь будет работать только с vector, для map к примеру он тупо ругнулся на отсутствие такой операции, что логично
AnreyKazakov
Заблокирован
09.09.2012, 14:58  [ТС]     Как вывести номер итератора в стандартный поток cout #5
Цитата Сообщение от diagon Посмотреть сообщение
distance
А эта функция из какой библиотеки? <iostream> или <vector>?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
09.09.2012, 15:13     Как вывести номер итератора в стандартный поток cout #6
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
А эта функция из какой библиотеки? <iostream> или <vector>?
http://en.cppreference.com/w/cpp/iterator/distance
http://cplusplus.com/reference/std/iterator/distance/
в <iterator>
AnreyKazakov
Заблокирован
09.09.2012, 15:32  [ТС]     Как вывести номер итератора в стандартный поток cout #7
Ого, оказывается еще и <iterator> надо подключать...
Еще одна задача, так же с косяком в одном месте, надо сложить первый элемент вектора с последним, второй с предпоследним и т.д , косяк в одном месте, выделил комментарием, так наверно нельзя присваивать, но тогда как?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main(){
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    using std::vector;
    int val;
    vector<int> vec;
    while(cin>>val)vec.push_back(val);
    vector<int>::iterator iter2=vec.end();
    vector<int>::iterator iter;
    for(iter=vec.begin();iter<iter2;++iter){
        iter2=iter2-iter; /*вот здесь вот он ругается*/
        val=*iter+*iter2;
        cout<<"Sum of vec["<<std::distance(vec.begin(),iter)<<"] and vec["<<std::distance(vec.begin(),iter2)<<"] is "<<val<<endl;
        }
        if(iter==iter2) cout<<"vec["<<std::distance(vec.begin(),iter)<<"] no pair. Hi's value "<<*iter<<endl;
    return 0;
    }
Добавлено через 7 минут
Переписал вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main(){
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    using std::vector;
    int val;
    vector<int> vec;
    while(cin>>val)vec.push_back(val);
    vector<int>::iterator iter2=vec.end()-1;
    vector<int>::iterator iter;
    for(iter=vec.begin();iter<iter2;++iter){
        val=*iter+*iter2;
        cout<<"Sum of vec["<<std::distance(vec.begin(),iter+1)<<"] and vec["<<std::distance(vec.begin(),iter2+1)<<"] is "<<val<<endl;
        --iter2;
        }
        if(iter==iter2) cout<<"vec["<<std::distance(vec.begin(),iter+1)<<"] no pair. Hi's value "<<*iter<<endl;
    return 0;
    }
Но, хотелось бы узнать причину почему прошлый вариант не работал, почему нельзя из одного итератора вычитать другой? Нельзя получается, а хотя можно наверно через ту же функцию distance сделать....

Добавлено через 2 минуты
Чет с итераторами такая муть возиться, с индексами гораздо удобней ИХМО, но в книжке написано что без них никуда ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 15:39     Как вывести номер итератора в стандартный поток cout
Еще ссылки по теме:

C++ Стандартный поток и STL (std::copy to std::cout)
Стандартный поток ввода, конец файла C++
C++ Стандартный поток ввода

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.09.2012, 15:39     Как вывести номер итератора в стандартный поток cout #8
C++
1
iter2=iter2-iter; /*вот здесь вот он ругается*/
Оператор - для итераторов вернет iterator::difference_type.

In the following sections, a and b denote values of type X or const X, difference_type and reference refer
to the types iterator_traits<X>::difference_type and iterator_traits<X>::reference, respectively,
n denotes a value of difference_type, u, tmp, and m denote identifiers, r denotes a value of X&, t denotes
a value of value type T, o denotes a value of some type that is writable to the output iterator. [ Note: For
an iterator type X there must be an instantiation of iterator_traits<X> (24.4.1). —end note ]
(operation)b - a (returns)difference-type

return n pre: there exists a value n of type difference_type suchthat a + n == b. b == a + (b - a).
Собственно достаточно использовать distance + advance. Ну или +=.

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
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main(){
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    using std::vector;
    int val;
    vector<int> vec;
    while(cin>>val)vec.push_back(val);
    vector<int>::iterator iter2=vec.end();
    vector<int>::iterator iter;
    for(iter=vec.begin();iter<iter2;++iter){
        vector<int>::iterator::difference_type diff = std::distance(iter, iter2);
        std::advance(iter2, diff);
        val=*iter+*iter2;
        cout<<"Sum of vec["<<std::distance(vec.begin(),iter)<<"] and vec["<<std::distance(vec.begin(),iter2)<<"] is "<<val<<endl;
        iter2 = vec.begin();
        }
        if(iter==iter2) cout<<"vec["<<std::distance(vec.begin(),iter)<<"] no pair. Hi's value "<<*iter<<endl;
    return 0;
    }
Yandex
Объявления
09.09.2012, 15:39     Как вывести номер итератора в стандартный поток cout
Ответ Создать тему
Опции темы

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