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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
#1

Как ведет себя вектор при добавлении новых элементов пушбеком? - C++

24.11.2011, 00:17. Просмотров 546. Ответов 7
Метки нет (Все метки)

Товарищи, ниже приведены несколько отрывков из моей программы. Интересует вопрос: почему не выполняется if в 23 строке?

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
int gc_node::update(gc_node *master, gc_node *slave)
{
    std::vector<gc_edge *>::iterator ei;
    std::vector<gc_edge *>::iterator is;
    std::vector<gc_edge *>::iterator im;
    int dist;
    ei = nvec.begin();
 
    for(i = 0; ei != nvec.end(); ++ei, ++i)
    {
        if((*ei)->getnode() == slave)
        {
            is = ei;
            dist = i;
        }
    }
        
    setneighbour(master, (*is)->getweight());
 
    im = is;
    is = nvec.begin();
    advance(is, dist);
    if(im == is) qDebug() << "ololo";
    delete *is;
    nvec.erase(is);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class gc_node
{
.........
    std::vector<gc_edge *> nvec;
public:
    void setneighbour(gc_node *neighbour, double edge_weight);
    int update(gc_node *master, gc_node *slave);
........
};
 
void gc_node::setneighbour(gc_node *neighbour, double edge_weight)
{
    gc_edge *temp_edge = new gc_edge(neighbour, edge_weight);
    nvec.push_back(temp_edge);
}
Ведь в данном коде я просто добавляю элемент в конец вектора, почему указанные мной итераторы не равны?

Добавлено через 4 минуты
Если еще нужна какая-то информация по этому коду, готов предоставить (целиком полторы тысячи строк решил не кидать=))

Добавлено через 4 минуты
Да, забыл добавить, что закоментив 18 строку, иф выполняется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2011, 00:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как ведет себя вектор при добавлении новых элементов пушбеком? (C++):

Как ведет себя cin, если пользователь вводит некорректные данные? - C++
Читаю C++ Primer Plus by Stephen Prata. В седьмой главе у него есть следующий пример. // lotto.cpp -- probability of winning ...

cin странно себя ведет - C++
Здравствуйте! Если в самом начале в майне написать char tch; cin.getline(tch,32) То все Ок, работает как надо. Но в в мэйне...

Програма неадекватно себя ведет - C++
Доброго время суток , помогите пожалуйста с кодом... Тут такое дело - програма запрашивает длинну и высоту стены( ширина 2 едигицы ) ...

Цикл While странно себя ведет - C++
Пишу программу которая считывает из каждой строки массив неизвестной длины.Цикл while(который помечен комментом) странно себя...

Ошибка при добавлении в вектор объекта типа thread - C++
функцию запускаю void Sorted_Char( char *Memory_Damp, int i_find, int size_arr, std::vector &lt; stream_g &gt;&amp;streams_f ) { for (int i...

Итератор по разному себя ведет в цикле - C++
Есть такой кусочек кода: string findKey (string key) { for (auto it = sectionList.begin(); it != sectionList.end(); it++) ...

7
Сыроежка
Заблокирован
24.11.2011, 00:20 #2
Svinina,

Я особо не вникал, но сразу же обратил внимание, что у вас некорректный код. Вы не инициализируете переменную dist. Поэтому если цикл не будет выполняться, или условие внутри тела цикла не будет удовлетворено, то значение этой переменной так и останется неопредеенным. Наверное ее надо вначале инициализировать нулем.

C++
1
2
3
4
5
6
7
8
9
10
11
 int dist;   // What is its value ???
    ei = nvec.begin();
 
    for(i = 0; ei != nvec.end(); ++ei, ++i)
    {
        if((*ei)->getnode() == slave)
        {
            is = ei;
            dist = i;
        }
    }
Кроме того, если между этим циклом и проверкой вашего if в 23 строке используется метод push_back, то итераторы могут стать недействительны, так как вектор может перераспределить память.
1
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
24.11.2011, 00:24  [ТС] #3
Сыроежка, я просто вырезал из кода много кусков, чтобы вам было проще вникнуть.
Если не выполнится цикл или иф, dist нигде использоваться не будет, проблема не в этом.
0
Сыроежка
Заблокирован
24.11.2011, 00:26 #4
Цитата Сообщение от Svinina Посмотреть сообщение
Сыроежка, я просто вырезал из кода много кусков, чтобы вам было проще вникнуть.
Если не выполнится цикл или иф, dist нигде использоваться не будет, проблема не в этом.
Я еще добавил замечание к своему предыдущему комментарию.
0
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
24.11.2011, 00:28  [ТС] #5
Кроме того, если между этим циклом и проверкой вашего if в 23 строке используется метод push_back, то итераторы могут стать недействительны, так как вектор может перераспределить память.
Во! То есть при пушбеке значения итераторов могут поменяться (точнее поменяются не значения итераторов, а адреса элементов векторе, на которые они указывали)?

Просто я тестировал подобное на векторе инта:

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
int main(int argc, char **argv)
{
    vector<int *> a;
    vector<int *>::iterator it;
    vector<int *>::iterator ei;
    for(int i = 0; i < 9; i++)
    {
        int *t = new int;
        a.push_back(t);
    }
 
    it = a.begin();
    for(int o = 0; it != a.end(); it++, o++)
    {
        if(o == 4) ei = it;
    }
    int *t = new int;
    a.push_back(t);
    it = a.begin();
    advance(it, 4);
    if (it == ei)
    {
        qDebug() << "ololo";
    }
    return 0;
}
И тут иф всегда выполнялся.
0
Сыроежка
Заблокирован
24.11.2011, 00:38 #6
Svinina,

У вас вообще это некорректный пример, так как вы объявляете вектор целых чисел, а заносите в него указатели!

Кроме того попробуйте увеличить число дополнительно добавляемых элементов вектора, чтобы в совокупности было, например, 17. И посмотрите, что будет.

Вы также можете использовать метод capacity(), чтобы посмотреть, как меняется выделение памяти вектора.
1
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
24.11.2011, 00:40 #7
Сыроежка, В коде объявлен вектор указателей на int.
0
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
24.11.2011, 00:45  [ТС] #8
Сыроежка, Опять же, при отправке примера сюда модифицировал его и забыл указатели проставить; поправил это.
Остальное сейчас посмотрю...

Добавлено через 3 минуты
Да, действительно при добавлении большого новых элементов условие перестает выполняться.
Спасибо, не знал.
0
24.11.2011, 00:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2011, 00:45
Привет! Вот еще темы с ответами:

Файловая система C++ некорректно себя ведет - C++
Файловая система C++ некорректно себя ведет. Считываю .bmp-файл в структуру (не во всю сразу), при выводе значений переменных из структуры...

STL Вектор Копирование элемнтов себя из себя - C++
Смысл такой, вектор содержит несколько чисел 1,2,3,4,5,6,7 Я хочу на алгоритмах скопировать некоторый блок элементов. например ...

класс string. Программа странно себя ведет - C++
Программа странно себя ведет. После первого ввода имени и номера сотрудника, пропускает последующие вводы имен, переходя сразу к номеру. ...

Почему при добавлении в вектор нового элемента capacity увеличивается с запасом? - C++
Почему vector.size() не всегда равен vector.capacity()? Можно же было в реализации вектора при добавлении нового элемента перераспределять...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru