Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» сортировка вектора в C++

Автор: Thritt
Дата сообщения: 25.08.2006 18:53
Задача: необходимо отсортировать массив целых чисел по возрастанию. т.к. изначально кол-во элементов массива неизвестно то я воспользовался классом vector из STL. Почти все работает, за исключением того что при сортировке пропадают отрицательные числа. Не могу понять в чем ошибка. Собственно код:

#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    while (true)
    {
        int i;
        vector<int> a(2);
        for (i = 1; i != 0; i++)
        {
            cout << "enter integer: \n";
            int c;
            cin >> c;
            if (c == 777) //
                break;
            else
            {
                a[i] = c;
                a.resize(a.size() + 1);
            }
        }
        for (int y = 1; y < a.size()-1; y++)
        {
            int min = y;
            for (int j = y+1; j < a.size(); j++)
                if (a[j] < a[min])
                    min = j;
            int buf = a[y];
            a[y] = a[min];
            a[min] = buf;
        }
        for (int k = 2; k < a.size(); k++)
        {
            cout << a[k] << " ";
        }
        cout << '\n' << '\n';
    }
    return 0;
}
Автор: KADABRA
Дата сообщения: 25.08.2006 19:31
Thritt
Зачем такие извращения?

Код:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void printNum(int num)
{
cout << num << " ";
}

int main()
{
// вектор
vector<int> arr;
// Вводим числа
while(! cin.fail())
{
int i;
cout << "enter integer: \n";
cin >> i;
arr.push_back(i);
}

// сотрируем
sort(arr.begin(), arr.end());

// Печатаем
for_each(arr.begin(), arr.end(), printNum);

cout << endl;

return 0;
}
Автор: Xarde
Дата сообщения: 25.08.2006 19:45
1. А зачем постоянно ресайз делать? Не проще ли просто вставлять? Помнится, в векторе есть то ли инсерт, то ли адд, то ли пуш...
2. Для сортировки в STL есть чудные методы, почему бы не использовать их, а не такой перебо "в лоб"?
3. Так, в принципе, похоже на вполне верный вариант. Попробуй при объявлении вектора указать не int, а signed int. Вряд ли поможет, но в твоём случае хуже не будет. Чтобы наверняка сказать, в чём проблема, надо отладить код.

Добавлено:
м-да... медленно пишу уже. старею...
Автор: Qraizer
Дата сообщения: 25.08.2006 20:42
KADABRA
Цитата:
// Печатаем
for_each(arr.begin(), arr.end(), printNum);
Попроще можно:
Код: copy(arr.begin(), arr.end(), ostream_iterator<int>(cout, " "))
Автор: KADABRA
Дата сообщения: 25.08.2006 21:47
Qraizer

Цитата:
Попроще можно:
Код:
copy(arr.begin(), arr.end(), ostream_iterator<int>(cout, " "))
Отпадает необходимость в printNum(), только #include <iterator> добавить придётся.

Я даже забыл про такую возможноость
Автор: Thritt
Дата сообщения: 25.08.2006 22:35
KADABRA

Цитата:
Зачем такие извращения?

ты был прав.
Спасибо за советы!

Автор: Thritt
Дата сообщения: 26.08.2006 10:33
А вот еще вопрос возник. А нельзя ли вместо vector использовать list? Если нет то для чего вообще нужет list?
Автор: xitsa
Дата сообщения: 26.08.2006 10:54

Цитата:
А вот еще вопрос возник. А нельзя ли вместо vector использовать list? Если нет то для чего вообще нужет list?

Можно. у list'а основное преимущество: при вставке/удалении итераторы остаются действительными, а у вектора нет такой гарантии. У list'а есть замечательный оператор splice, который позволяет быстро перетаскивать данные из списка в список. Вставка происходит с одинаковой скоростью, вне зависимости от того, сколько там было элементов.
В общем, и list и vector имеют свои преимущества и недостатки. Иногда полезен один, иногда—другой
Автор: Thritt
Дата сообщения: 26.08.2006 11:15
xitsa

Цитата:
В общем, и list и vector имеют свои преимущества и недостатки. Иногда полезен один, иногда—другой

ну так что же лучше использовать в моем случае?
Автор: Qraizer
Дата сообщения: 26.08.2006 14:59
ИМХО вектор. "Если нет разницы...", следует использовать более универсальный.
Автор: Xarde
Дата сообщения: 26.08.2006 15:02

Цитата:
ИМХО вектор. "Если нет разницы...", следует использовать более универсальный.

И чем же вектор более универсален, чем лист?
Автор: Qraizer
Дата сообщения: 26.08.2006 15:13
KADABRA
Вот интересно, раз уж на то пошло, не лучше ли тогда и ввод переписать по образу и подобию:
Код: copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(arr));
Автор: Thritt
Дата сообщения: 26.08.2006 19:04
Еще раз спасибо за предоставленные ответы, очень помогли.
Автор: KADABRA
Дата сообщения: 26.08.2006 20:28
Qraizer
Но тогда перед вводом каждого числа не будет "enter integer: "
Хотя врядли оно кому-то нужно

Страницы: 1

Предыдущая тема: ServerSocket/ClientSocket в Delphi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.