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

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

Восстановить пароль Регистрация
 
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
24.11.2011, 00:17     Как ведет себя вектор при добавлении новых элементов пушбеком? #1
Товарищи, ниже приведены несколько отрывков из моей программы. Интересует вопрос: почему не выполняется 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 строку, иф выполняется.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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, то итераторы могут стать недействительны, так как вектор может перераспределить память.
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
24.11.2011, 00:24  [ТС]     Как ведет себя вектор при добавлении новых элементов пушбеком? #3
Сыроежка, я просто вырезал из кода много кусков, чтобы вам было проще вникнуть.
Если не выполнится цикл или иф, dist нигде использоваться не будет, проблема не в этом.
Сыроежка
Заблокирован
24.11.2011, 00:26     Как ведет себя вектор при добавлении новых элементов пушбеком? #4
Цитата Сообщение от Svinina Посмотреть сообщение
Сыроежка, я просто вырезал из кода много кусков, чтобы вам было проще вникнуть.
Если не выполнится цикл или иф, dist нигде использоваться не будет, проблема не в этом.
Я еще добавил замечание к своему предыдущему комментарию.
Svinina
 Аватар для 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;
}
И тут иф всегда выполнялся.
Сыроежка
Заблокирован
24.11.2011, 00:38     Как ведет себя вектор при добавлении новых элементов пушбеком? #6
Svinina,

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

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

Вы также можете использовать метод capacity(), чтобы посмотреть, как меняется выделение памяти вектора.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.11.2011, 00:40     Как ведет себя вектор при добавлении новых элементов пушбеком? #7
Сыроежка, В коде объявлен вектор указателей на int.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2011, 00:45     Как ведет себя вектор при добавлении новых элементов пушбеком?
Еще ссылки по теме:

класс string. Программа странно себя ведет C++
Почему программа себя странно ведет: зацикливается после ввода значений? C++
STL Вектор Копирование элемнтов себя из себя C++

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

Или воспользуйтесь поиском по форуму:
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
24.11.2011, 00:45  [ТС]     Как ведет себя вектор при добавлении новых элементов пушбеком? #8
Сыроежка, Опять же, при отправке примера сюда модифицировал его и забыл указатели проставить; поправил это.
Остальное сейчас посмотрю...

Добавлено через 3 минуты
Да, действительно при добавлении большого новых элементов условие перестает выполняться.
Спасибо, не знал.
Yandex
Объявления
24.11.2011, 00:45     Как ведет себя вектор при добавлении новых элементов пушбеком?
Ответ Создать тему
Опции темы

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