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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Cвязанные списки, сортировка 2-х массивов 
:(
    Опции темы
pfSense
Дата 10.5.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть 2 целочисленных вектора, А и В с максимальным размером 100 элементов.  
Если в векторе А нет ни одного элемента больше предыдущего, то осуществить перестановку вектора B в следующем порядке: все нулевые элементы, затем чередование отрицательных и положительных элементов. В противном случае сформировать вектор результата C  как конкатенацию отсортированы по убыванию векторов A и B.
PM MAIL   Вверх
Rififi
Дата 11.5.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код
#include <vector>
#include <functional>
#include <algorithm>

/*
Есть 2 целочисленных вектора, А и В с максимальным размером 100 элементов.  
Если в векторе А нет ни одного элемента больше предыдущего, то осуществить
перестановку вектора B в следующем порядке:
все нулевые элементы, затем чередование отрицательных и положительных элементов.
В противном случае сформировать вектор результата C  как конкатенацию отсортированы по убыванию векторов A и B.
*/

// определение бОльшего элемента
struct greater_element : public std::binary_function<int, int, bool>
{
    result_type operator()(const first_argument_type v1, const second_argument_type v2)
    {
        return v2 > v1;
    }
};

int main()
{
    typedef std::vector<int> V;
    const size_t N = 100;

    V A, B;
    A.reserve(N);
    B.reserve(N);
    
    // заполнение векторов A и B
    ...
    
    // определение, есть ли в массиве элементы больше предыдущего
    V::const_iterator it = std::adjacent_find(A.begin(), A.end(), greater_element());
    if (it == A.end())
    {
        // каждый элемент массива - не больше предыдущего
        // B = все нулевые элементы, затем чередование отрицательных и положительных элементов.
        V tmp(std::count(B.begin(), B.end(), 0));
        V::iterator less0, greater0;
        less0 = greater0 = B.begin();
        std::binder2nd<std::less<V::value_type> > less_pred = std::bind2nd(std::less<V::value_type>(), 0);
        std::binder2nd<std::greater<V::value_type> > greater_pred = std::bind2nd(std::greater<V::value_type>(), 0); 

        do
        {
            if ((less0 = std::find_if(less0, B.end(), less_pred)) != B.end())
                tmp.push_back(*less0++);
            if ((greater0 = std::find_if(greater0, B.end(), greater_pred)) != B.end())
                tmp.push_back(*greater0++);
        } while (less0 != B.end() || greater0 != B.end());
        B = tmp;
    }
    else
    {
        // найден по крайней мере один элемент, больше предыдущего
        // сформировать вектор результата C  как конкатенацию отсортированы по убыванию векторов A и B
        V C;
        C.reserve(N*2);

        // Добавить вектор A
        std::sort(A.begin(), A.end(), std::greater<V::value_type>());
        std::copy(A.begin(), A.end(), std::back_inserter(C));
        
        // Добавить вектор B
        std::sort(B.begin(), B.end(), std::greater<V::value_type>());
        std::copy(B.begin(), B.end(), std::back_inserter(C));        
    }
    return (0);
}


Это сообщение отредактировал(а) Rififi - 11.5.2008, 18:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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