Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL vector, STL vector 
:(
    Опции темы
stas52
Дата 13.1.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Объязательно надо использовать Vector
Надо пройти по Массиву  и найденные нолики поставить в начало массива. 
Я тут набросал кусочек. Понятное дело что он не работает. 
Подскажите пожалуйста как это сделать правильно (допустим используя Insert)

Код


    vector<float> Mas;
    vector<float>::iterator i;

    for (int k=0; k<=5; k++)
            {

            for (i = Mas.begin()+k; i != Mas.end(); i++)
                    {
                        *i=Mas.begin+i;
                        Mas.begin+i=0;
                    }

            }


PM MAIL   Вверх
Rockie
Дата 13.1.2007, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



stas52, сначала добавляешь в свой Mas элементы, только положительные: 
Код
Mas.push_back(10);

Потом подключаешь <algorithm> и пишешь 
Код
sort( Mas.begin(), Mas.end() ); 

Выводишь наприме так:
Код

vector<float>::iterator p=Mas.begin();       
 while(p!=Mas.end())
  { cout<<*p<<' ';
    p++;
  }


Преподавателю рассказываешь что ты перевыполнил план и даже использовал алгоритмы.
smile




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 13.1.2007, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Rockie, а если без сортировки? smile чтобы сдвинулись элементы ... С list и deque понятно, а тут как бы smile


--------------------
user posted image  
PM MAIL   Вверх
Oleg_Ci
Дата 13.1.2007, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



алгоритм partition и stable_partition переставляет элементы в начало smile 
Только первый может заменить "порядок следования" элементов
Код

#include <iostream>
#include <vector>
#include <algorithm>
using std::cout;
using std::vector;

// функция сравнения (предикат для перестановок)
template <typename T>
bool cmp( T a ){
    return !a;
}

int main(){
    vector<float> array;
    vector<float>::iterator ptr;

    // вводим в массив числа
    array.push_back(10.2);
    array.push_back(-3.);
    array.push_back(0);
    array.push_back(0);
    array.push_back(4.3);

    // перестановка в начало ( попробуй - partition ... )
    std::stable_partition( array.begin(), array.end(), cmp<float> );

    // вывод содержимого на консоль
    for( ptr=array.begin(); ptr!=array.end(); ++ptr )
        cout << *ptr << "\n";

    std::cin.get(); // пауза
    return 0;
}

PM MAIL   Вверх
ip127001
Дата 13.1.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



а если удалять erase и добавлять insert в начало....мож получиться

Это сообщение отредактировал(а) ip127001 - 13.1.2007, 11:38
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
Sartorius
Дата 13.1.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Код

#include <vector>
#include <iostream>
int main()
{
    std::vector<int> vect;
    int data[] = {0,1,-1,435,324,0};
    int zerrous = 0;
    int i;

    for(i = 0; i < sizeof(data)/sizeof(data[0]); i++)
    {
        vect.push_back(data[i]);
    }


    for( i = 0; i < vect.size(); i++)
    {
        if(vect[i] == 0)
        {
            zerrous++;
            vect.erase(vect.begin() + i);
            i--;
        }

    }

    for(i = 0; i < zerrous; i++)
    {
        vect.insert(vect.begin(), 0);

    }

    for(i = 0; i < vect.size(); i++)
        std::cout << "\n" << vect[i];
    return 0;
}



Это сообщение отредактировал(а) Sartorius - 13.1.2007, 12:07
PM MAIL ICQ   Вверх
zkv
Дата 13.1.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Oleg_Ci, я бы присудил вам пальму первенства в нахождении наиболее оптимального решения smile, вот только идентификатор array, думаю, выбран не совсем удачно. 
Sartorius, пара моментов smile
1.
Цитата(Sartorius @  13.1.2007,  12:06 Найти цитируемый пост)
 for( i = 0; i < vect.size(); i++)
    {
        if(vect[i] == 0)
        {
            zerrous++;
            vect.erase(vect.begin() + i);
            i--; //??????
        }
    }

по моему, изменение счетчика внутри for далеко не лучший стиль программирования

2.
Цитата(Sartorius @  13.1.2007,  12:06 Найти цитируемый пост)
            vect.erase(vect.begin() + i);

почему бы не просто vect.erase( i );

3. 
Цитата(Sartorius @  13.1.2007,  12:06 Найти цитируемый пост)
 for(i = 0; i < sizeof(data)/sizeof(data[0]); i++)
    {
        vect.push_back(data[i]);
    }

может так лаконичнее?
Код

vect.assign( &data[0], &data[ sizeof(data)/sizeof(data[0]) ] );

PS Sartorius, ни в коем случае не воспринимайте как наезды smile

PM MAIL   Вверх
Daevaorn
Дата 13.1.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Sartorius @  13.1.2007,  13:06 Найти цитируемый пост)
for( i = 0; i < vect.size(); i++)
    {
        if(vect[i] == 0)
        {
            zerrous++;
            vect.erase(vect.begin() + i);
            i--;
        }

    }

Код

std::vector<int>::iterator last = std::remove( vect.begin(), vect.end(), 0 );
zerrous = vect.end() - last;
vect.erase( last, vect.end() );

smile
PM MAIL WWW   Вверх
Sartorius
Дата 13.1.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Daevaorn, zkv,  smile  сорри, второй раз STL пользуюсь, хотелось че-нит разумное, доброе, вечное написать  smile 
PM MAIL ICQ   Вверх
stas52
Дата 14.1.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Подскажите пожалуйста, что я делаю не так?

Код

    vector<float> Mas;
    vector<float>::iterator i;

    i=Mas.begin();
    while (i != Mas.end())
        {
            if ((*i)==0)
                {
                Mas.erase(Mas.begin()+i);
                }
            i++;
        }



Я  также пытался заменить строку Mas.erase(Mas.begin()+i); на Mas.erase(i);

Тоже выдает ошибку. Если можно, хотелось бы попонятнее.
PM MAIL   Вверх
Daevaorn
Дата 14.1.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



stas52, 
Код

Mas.erase( std::remove( Mas.begin(), Mas.end(), 0 ) );

PM MAIL WWW   Вверх
stas52
Дата 14.1.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Так то работает. Спасибо. Но вот хотелось бы с "erase" т.к. мне таким же самым образом надо использовать потом и "Insert"
PM MAIL   Вверх
Daevaorn
Дата 14.1.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



надо
Цитата(stas52 @  14.1.2007,  15:43 Найти цитируемый пост)
Mas.erase(i);


PM MAIL WWW   Вверх
stas52
Дата 14.1.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Ну и если я делаю так


    i=Mas.begin();
    while (i != Mas.end())
        {
            if ((*i)==0)
                {
                Mas.erase(i);
                }
            i++;
        }

в результате Microsoft Visual Studio выводит ошибку:

Debug Assertion Failed!
Program: d:\MY_BIG_ARHIV\My_Institut\C++\lrl\lrl\debug\lrl .exe File: c:\program files\microsoft visual studio 8\vc\include\vector
Line: 117
Expression: ("this->Jvlycont != NULL", 0)
For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
PM MAIL   Вверх
Daevaorn
Дата 14.1.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(stas52 @  14.1.2007,  17:04 Найти цитируемый пост)
в результате Microsoft Visual Studio выводит ошибку:

и правильно делает, потому что ты удаляешь в цикле, а все итераторы после удаляемого становятся недействительны.

Добавлено @ 16:14 
Цитата(stas52 @  14.1.2007,  17:04 Найти цитируемый пост)
 i=Mas.begin();
    while (i != Mas.end())
        {
            if ((*i)==0)
                {
                Mas.erase(i);
                }
            i++;
        }

Код

for( i = Mas.begin(); i != Mas.end(); ++i )
   if( *i==0 )
   {
      --i;
      Mas.erase( i + 1);
   }


PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.