std :: sort () C ++ не работает, но это так просто, почему :( 1D массив - PullRequest
1 голос
/ 18 апреля 2011

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

int main()
{
    readFromFile();
    system("pause");
    return 0;
}

void readFromFile()
{
    string line;
    int i = 0;
    int j;
    ifstream file("ACW2_data.txt");

if(file.is_open())
{
    getline(file, line);

    while (!file.eof())
    {
        file >> numbers[i];
        i++;
        int elements = sizeof(numbers) / sizeof(numbers[0]);
        **sort(numbers, numbers + elements);**
    }
    file.close();
}
else
{
    cout << "Cant open the file" << endl;
}

for(j = 0; j < i; j++)
{
    cout << numbers[j] << endl;
}

system("pause");
}

что вы думаете, ребята?

Ответы [ 4 ]

2 голосов
/ 18 апреля 2011

Редактировать: На данный момент я предполагаю, что numbers был массивом int. Если нет, я надеюсь, ты сможешь понять, что делать ...

int main() { 
    std::ifstream file("ACW2_data.txt");

    std::vector<int> numbers;

    file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    std::copy(std::istream_iterator<int>(file),
              std::istream_iterator<int>(),
              std::back_inserter(numbers));

    std::sort(numbers.begin(), numbers.end());

    std::copy(numbers.begin(), numbers.end(), 
              std::ostream_iterator<int>(std::cout, "\n"));
    return 0;
}
2 голосов
/ 18 апреля 2011
while (!file.eof())
{
    file >> numbers[i];
    i++;
    int elements = sizeof(numbers) / sizeof(numbers[0]);
    **sort(numbers, numbers + elements);**
}
file.close();

до

while (file >> numbers[i])
{
    ++i;
}
sort( numbers, numbers + i );
file.close();

или

std::vector<your_int_type> numbers;
your_int_type tmp;
while (file >> tmp)
{
    numbers.push_back(tmp);
}
std::sort( numbers.begin(), numbers.end() );
file.close();
0 голосов
/ 18 апреля 2011

Мое странное предположение, поскольку вы не показываете важную деталь того, как объявляется numbers, это то, что это указатель, а трюк sizeof не может вычислить выделенный размер.Лучше использовать основанный на шаблоне sizeof, например:

template <typename T, int N>
int array_size( T (&)[N] ) {
   return N;
}

или:

template <typename T, int N>
char (&array_size_impl( T(&)[N] ))[N];
#define ARRAY_SIZE( x ) sizeof( array_size_impl( x ) )

Так как они будут вызывать ошибки времени компиляции, если используется указатель, вместо тихого сбоя и выдачинеожиданные результаты как sizeof(x)/sizeof(x[0]) трюк.

0 голосов
/ 18 апреля 2011

Во-первых, где определяется numbers и каков его тип?

Во-вторых, число элементов в numbers равно i на каждой итерации цикла while, поэтому вам не нужно его вычислять.

В-третьих, почему вы сортируете numbers каждый раз, когда вставляете новый элемент? Почему бы не вставить все элементы, а затем отсортировать один раз. После цикла while это.

...