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

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

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

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

24.11.2011, 00:17. Просмотров 527. Ответов 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 строку, иф выполняется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2011, 00:17     Как ведет себя вектор при добавлении новых элементов пушбеком?
Посмотрите здесь:

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

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

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

Ошибка при добавлении в вектор объекта типа 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++ некорректно себя ведет - C++
Файловая система C++ некорректно себя ведет. Считываю .bmp-файл в структуру (не во всю сразу), при выводе значений переменных из структуры...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
24.11.2011, 00:24  [ТС]     Как ведет себя вектор при добавлении новых элементов пушбеком? #3
Сыроежка, я просто вырезал из кода много кусков, чтобы вам было проще вникнуть.
Если не выполнится цикл или иф, dist нигде использоваться не будет, проблема не в этом.
Сыроежка
Заблокирован
24.11.2011, 00:26     Как ведет себя вектор при добавлении новых элементов пушбеком? #4
Цитата Сообщение от Svinina Посмотреть сообщение
Сыроежка, я просто вырезал из кода много кусков, чтобы вам было проще вникнуть.
Если не выполнится цикл или иф, dist нигде использоваться не будет, проблема не в этом.
Я еще добавил замечание к своему предыдущему комментарию.
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
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
24.11.2011, 00:40     Как ведет себя вектор при добавлении новых элементов пушбеком? #7
Сыроежка, В коде объявлен вектор указателей на int.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2011, 00:45     Как ведет себя вектор при добавлении новых элементов пушбеком?
Еще ссылки по теме:

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

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

Std::forward_list по-разному ведет себя с компиляторами gcc и vc++ - C++
Есть такой код: #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;forward_list&gt; using namespace std; void show(const...

Почему программа себя странно ведет: зацикливается после ввода значений? - C++
Зацикливается после воода значений. Подскажите пожалуйста в чем может быть проблема. #include &lt;fstream&gt; #include &lt;iostream&gt; ...


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

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

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

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