Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Проблема с вектором из СТЛ

Автор: Scorp_Freeman 21.11.2007 0:51

vector<Nabor> mas;

Вектор состоит из структур типа:

Код

// Структура, описывающая одну комбинацию
struct Nabor{
    char codes[32];
    bool flag;
    bool operator <(const Nabor &b)const
    { return count(codes)<count(b.codes);}
    //~Nabor(){delete [] codes;}
};


Некоторые фрагменты не показываю, а то многовато будет)). Заполняю вектор вроде правильно, потому как я в конце программы его вывожу и все нормально....


Но вот в этом фрагменте он почему то не работает(. При пошаговом выполнении итератор "к" ничему не равен (выделенное выражение) и дальше все(((, а еще почему то не могу при пошаговой отладке посмотреть значения вектора, это нормально?.
Этот фрагмент находится в главной функции майн.
Moment - это моя функция которая возращает целое.

Код

vector<Nabor>::iterator k,j;[code]
    
k=mas.begin();
Код
int level=count(k->codes);
    cout<<k->codes;
    while (k!= mas.end()){
        
        j=k+1;
//        cout<<j->codes;
        while ((j!=mas.end())&&(count(j->codes)<=(level+1))){
            if (count(j->codes)==(level+1)){
                int t=Moment(k->codes, j->codes);
                if (t==1) cout<<endl<<t<<endl;
                cout<<'btyu';
            }
            j=j+1;
        }
        k=k+1;
    }

Автор: volvo 21.11.2007 1:11

Цитата
Некоторые фрагменты не показываю, а то многовато будет))
А придется, если нужна помощь, а не сеанс гадания на кофейной гуще... Присоединил бы в RAR-е...

Цитата
почему то не могу при пошаговой отладке посмотреть значения вектора, это нормально?.
Нормально... vector - это не простой массив, а сложный объект, поэтому до хранимых в нем данных не так просто добраться...

Автор: Scorp_Freeman 22.11.2007 1:21

Вот текст программы я прилепил).
Проблема в функции Kley. При пошаговом выполнении программы некоторые переменные (level, k, j) не верные значения ((


Программа берет данные для вектора из текстового файла ""C:\\Data.txt", а вот его содержание:

Y=(199999,7,5,6,8,32,6,5,255);



Прикрепленные файлы
Прикрепленный файл  Version_1_33.txt ( 3.93 килобайт ) Кол-во скачиваний: 254

Автор: volvo 22.11.2007 2:00

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

Что касается собственно программы - ничего подозрительного у меня она не выдает, все значения level и codes - совпадают с ранее внесенными в vector значениями. Программа отрабатывает (MSVS не пользуюсь, у меня GCC), но поскольку я не знаю, что она должна выдать - то и не буду говорить, правильно или нет. Хотя функцию Kley я бы переписал вот так:

void Kley(vector<Nabor> &Nabor1, vector<Nabor>){

int level;
vector<Nabor>::iterator k = Nabor1.begin();
level = count(k->codes);
cout << k->codes;
for(;
k != Nabor1.end(); k++)
{
for(vector<Nabor>::iterator j = k + 1;
(j != Nabor1.end()) && (count(j->codes)<=(level+1));
j++)
{
if(count(j->codes) == (level+1)) {
int t = Moment(k->codes, j->codes);
if(t == 1) cout << endl << t << endl;
cout << 'btyu';
}
}

}
}


Автор: Scorp_Freeman 22.11.2007 4:40

Цитата
Ты меня, конечно, извини, но моего владения телепатией явно недостаточно, чтобы постичь глубокий смысл этой программы...


blum.gif , да , согласен, но это не конечный вариант проги )), я просто проверяю сразу все что написал

Цитата
Что касается собственно программы - ничего подозрительного у меня она не выдает, все значения level и codes - совпадают с ранее внесенными в vector значениями.


А у меня строки которые я отметил никогда не выводятся на экран......

void Kley(vector<Nabor> &Nabor1, vector<Nabor>){

int level;
vector<Nabor>::iterator k = Nabor1.begin();
level = count(k->codes);
cout << k->codes; // <=================
for(;
k != Nabor1.end(); k++)
{
for(vector<Nabor>::iterator j = k + 1;
(j != Nabor1.end()) && (count(j->codes)<=(level+1));
j++)
{
if(count(j->codes) == (level+1)) {
int t = Moment(k->codes, j->codes);
if(t == 1) cout << endl << t << endl; // <===========
cout << 'btyu'; // <=============
}
}

}
}



Автор: volvo 22.11.2007 13:55

blink.gif Что, и даже сразу после получения итератора

cout << k->codes;
тоже не печатается? "Что-то неладно в Датском королевстве" (С)
А что для *k отладчик показывает перед выполнением этой строки? Желательно развернуть все дерево для *k, и сделать скриншот.

А вообще - напиши маленькую тестовую программу: используй vector<int>, и на нем проверь работоспособность итератора. Что-то слишком странное происходит...

Автор: Scorp_Freeman 22.11.2007 14:30

smile.gif упс, сорри. Печатает просто не заметил в этих дебрях))) спасибо smile.gif


Вот просто мне не нравится что при пошаговой не можно просмотреть значения параметров ((((

Добавлено через 4 мин.
А вот скрины:




Эскизы прикрепленных изображений
Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение

Автор: Scorp_Freeman 6.04.2008 15:06

По ходу дела возник еще 1 вопросик smile.gif Вот у меня есть вектор векторов (vector<vector<int>>) который представляет собой массив числовых последовательностей. Я пытаюсь удалить все последовательти которые содержат любую другую. Хотел сделать в цикле вот так:

Код
vector<vector<int>>::iterator u;
        u = bufs.begin();
        while (u != bufs.end()){
            vector<vector<int>>::iterator t;
            t = u;
            t++;
            while (t != bufs.end()){
                if (((*u).size() > (*t).size())&& search((*u).begin(), (*u).end(), (*t).begin(), (*t).end()) != (*u).end())
                    bufs.erase(u);
                if (((*t).size() > (*u).size())&& search((*t).begin(), (*t).end(), (*u).begin(), (*u).end()) != (*t).end())
                    bufs.erase(t);
                /*if ( ((*u).size() == (*t).size()) && equal((*u).begin(), (*u).end(), (*t).begin()) );
                    bufs.erase(t);*/
                
            t++;
            }
        u++;
        
        }


Но в процессе выполнения выдает иногда фатальную ошибку :
Microsoft Visual Studio C Runtime Library has detected a fatal error in Version_1_33.exe.

Press Break to debug the program or Continue to terminate the program.

Как можно удалять элементы вектора в цикле ? )

Автор: volvo 6.04.2008 15:56

Сделай тестовую программу, которая заполняет твой список списков и ищет в нем то, что нужно, но при этом вылетает, а то выдумывать, как ты реализовал заполнение, и что именно там может быть неправильно в твоей реализации - не очень хочется...

Автор: Scorp_Freeman 6.04.2008 17:48

А интересно, вот если в цыкле

vector<int> mas;
...

vector<int>::iterator i;
i = mas.begin();

while( i!= mas.end() ){
if <условие> mas.erase(i);
i ++;

}


Если выполнится условие и элемент i будет удален из вектора, на что будет ссілаться итератор i ? На предыдущий элемент?

Автор: volvo 6.04.2008 18:00

С чего бы?

Цитата(C++ Standard)
23.2.4.3 vector modifiers [lib.vector.modifiers]
<...>
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
3 Effects: Invalidates all the iterators and references after the point of the erase.
После erase итератор станет невалидным...