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

vector(выскакивает ошибка "vector iterators incompatible") - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 17:12     vector(выскакивает ошибка "vector iterators incompatible") #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
49
50
51
52
53
54
55
56
57
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;
 
void print(int elem)
{
    cout << elem << ' ';
}
 
int _tmain(int argc, _TCHAR* argv[])
{   
    vector<int> coll;
    //создание конечного итератора для coll
    //не удобный способ
 
    back_insert_iterator<vector<int> > iter(coll);
 
    //вставка элемента через обычный интерфейс итераторов
    *iter = 1;
    iter++;
    *iter = 2;
    iter++;
    *iter = 3;
 
    for_each(coll.begin(), coll.end(), print);
    cout << endl;
 
    //создание конечно итератора и вставка элементов
    //удобный способ
 
    back_inserter(coll) = 44;
    back_inserter(coll) = 55;
 
    for_each(coll.begin(), coll.end(), print);
    cout << endl;
 
    /*присоединение всех элементов контейнера с использованием
    конечно итератора вставки
    резервирование памяти для предотвращения ее перераспределения*/
 
    coll.reserve(2*coll.size());
    copy(coll.begin(), coll.end(),                      //источник
                       back_inserter(coll));            //приемник
 
    for_each(coll.begin(), coll.end(), print);
    cout << endl;
 
    cout << "\n\n";
    return 0;
}
выскакивает ошибка "vector iterators incompatible" делал все по книге, перепроверял, все так, но ошибка выскакивает... заранее благодарю за помощь!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
26.03.2013, 17:34     vector(выскакивает ошибка "vector iterators incompatible") #2
я так понимаю ошибка выскакивает в районе 26й строки? Ты ведь вектор объявил и ничем его не заполнил, перед изменением значения элемента, на который указывает итератор следует проверять не вышел ли он за допустимый диапазон. вообще, насколько я знаю, итераторы для вектора возвращают ф-ции ".begin()" и ".end()". З.Ы. что за книга?

Добавлено через 44 секунды
в общем твой итератор, походу, указывает не на элемент твоего вектора а неизвестно куда
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 17:58  [ТС]     vector(выскакивает ошибка "vector iterators incompatible") #3
igor001, ошибка выскакивает в 49-50 строке... книга С++ Стандартная библиотека для профессионалов.

Добавлено через 3 минуты
igor001,
Цитата Сообщение от yoghurt92 Посмотреть сообщение
back_insert_iterator<vector<int> > iter(coll)
все ровно что

C++
1
coll.push_back()
так что работать должно, проблема при копировании...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.03.2013, 18:29     vector(выскакивает ошибка "vector iterators incompatible") #4
C++
1
2
copy(coll.begin(), coll.end(),                      //источник
                       back_inserter(coll));            //приемник
тут итератор end() "протухает" и скорее всего итератор begin() тоже, если в момент работы функции делалось перераспределение памяти, а оно почти 100% делалось, т.к. размер вектора увеличился в 2 раза.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.03.2013, 18:35     vector(выскакивает ошибка "vector iterators incompatible") #5
delete
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 18:35  [ТС]     vector(выскакивает ошибка "vector iterators incompatible") #6
Kastaneda,
Цитата Сообщение от yoghurt92 Посмотреть сообщение
coll.reserve(2*coll.size());
я специально зарезервировал память чтобы предотвратить перераспределение и итераторы не "протухли"....
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.03.2013, 18:37     vector(выскакивает ошибка "vector iterators incompatible") #7
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Kastaneda,


я специально зарезервировал память чтобы предотвратить перераспределение и итераторы не "протухли"....
А точно, не заметил. Я еще удивился почему у меня без ошибки все отработало.

Добавлено через 48 секунд
yoghurt92, а какой компилятор?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 18:40  [ТС]     vector(выскакивает ошибка "vector iterators incompatible") #8
Kastaneda, у меня VS 2008...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.03.2013, 18:43     vector(выскакивает ошибка "vector iterators incompatible") #9
Даже хз, может в 2008 STL как-то криво реализована, хотя врядли конечно..
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 18:45  [ТС]     vector(выскакивает ошибка "vector iterators incompatible") #10
Kastaneda, а у вас все нормально сработало?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.03.2013, 18:48     vector(выскакивает ошибка "vector iterators incompatible") #11
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Kastaneda, а у вас все нормально сработало?
Ага, в g++ нормально и сейчас под винду ребутнулся, в VS 2012 тоже нормально.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
26.03.2013, 18:50  [ТС]     vector(выскакивает ошибка "vector iterators incompatible") #12
Kastaneda, значит это что-то у меня... спасибо вам, хоть буду знать, что не я виноват
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
27.03.2013, 10:27     vector(выскакивает ошибка "vector iterators incompatible") #13
Цитата Сообщение от yoghurt92 Посмотреть сообщение
igor001, ошибка выскакивает в 49-50 строке... книга С++ Стандартная библиотека для профессионалов.

Добавлено через 3 минуты
igor001,


все ровно что

C++
1
coll.push_back()
так что работать должно, проблема при копировании...
хз, у меня RAD Studio такой итератор ( back_insert_iterator<vector<int> > iter(coll); ) не знает и ругает меня за то что я попытался его использовать
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.03.2013, 10:28     vector(выскакивает ошибка "vector iterators incompatible") #14
igor001, там в коде <iterator> надо инклюдить. ТС видать забыл.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
27.03.2013, 11:11     vector(выскакивает ошибка "vector iterators incompatible") #15
кстати да, есть у меня такая проблема, забывать подключать библиотеки в новом проекте))
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2013, 19:03     vector(выскакивает ошибка "vector iterators incompatible") #16
Есть обсуждение по подобной теме.
И вот смущает меня там фраза такая:
Even if your container had sufficient capacity, its behavior would still be undefined: the specification states that, upon insertion, "if no reallocation happens, all the iterators and references before the insertion point remain valid" (C++11 §23.3.6.5/1).
Т.е. получается всё равно UB.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2013, 21:38     vector(выскакивает ошибка "vector iterators incompatible")
Еще ссылки по теме:

Структура "Vector": создать, удалить, прибавить C++
Ошибка: argument of type "char *" is incompatible with parameter of type "LPCWSTR" C++
Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.03.2013, 21:38     vector(выскакивает ошибка "vector iterators incompatible") #17
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. получается всё равно UB.
Чтоб быть в этом увереным, нужно посмотреть что говорит стандарт по поводу перераспределения памяти в векторе. В том посте (на stackoverflow) человек пытался объяснить, что нельзя быть увереным в том, что не будет перераспределения даже если vector.size() == vector.capacity(), т.е. возможно вектор может перераспределить память когда это не ожидается.
Хотя я и не думаю, что вектор реализован таким образом, все же стОит уточнить это.
Yandex
Объявления
27.03.2013, 21:38     vector(выскакивает ошибка "vector iterators incompatible")
Ответ Создать тему
Опции темы

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