Цикл никогда не заканчивается ?? нужна помощь. C ++ - PullRequest
0 голосов
/ 27 февраля 2011

Quesition:

С учетом ввода, подобного этому:

int myintsA[]={1,3,3,2,2,5,5,5,4};
int myintsB[]={0,9,8,6,7,3,3,4};

Найти те же элементы, положить его. Когда они появляются как 2 раза. положить его как 2 раза.

Например:
Выход: {3,3,4}

   #include <iostream>
#include <vector>
#include <list>
#include <ext/hash_map>

using namespace __gnu_cxx;
using namespace std;

list<int> findDup(const vector<int>& A ,const vector<int>& B)
{
    list<int> idx;
    std::vector<int>::size_type i = 0;
    std::vector<int>::size_type j = 0;
    while(i < A.size() && j < B.size()) {
        if (A[i] == B[j])
        {
            idx.push_back(A[i]);
            i++;
            j++;
        }
        else if(A[i] < B[j])
        {
            i++;
        }
        else if (A[i] > B[j])
        {
            j++;
        }
    }
    return idx;

}

int main()
{
    int myintsA[]={1,3,2,2,5,5,5,4};
    int myintsB[]={0,9,8,6,7,3,3,4};

    vector<int> myvectorA (myintsA, myintsA + sizeof(myintsA) / sizeof(int) );
    vector<int> myvectorB (myintsB, myintsB + sizeof(myintsB) / sizeof(int) );


    sort(myvectorA.begin(),myvectorA.end());
    sort(myvectorB.begin(),myvectorB.end());

    list<int> result = findDup(myvectorA, myvectorB);
    for(list<int>::iterator iter = result.begin(); iter!=result.end();++iter)
    {
        printf("%c",*iter);
    }
    return 0;
}

Но моя программа кажется неправильной. нужна помощь! СПАСИБО!

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011
    else if(A[i] < B[i])

Полагаю, вы имели в виду:

    else if(A[i] < B[j])  // B uses j, not i

это может быть причиной вашего бесконечного цикла.

Редактировать: И, как указывает Иеремия, ваше состояние пока испортилось. Нормальная практика выглядит примерно так:

while(i < A.size() && j < B.size()) {
2 голосов
/ 27 февраля 2011

Вот рабочая версия кода, отправленного ранее:

#include <iostream>
#include <vector>
#include <list>
#include <algorithm> //It's better to use the standard <algorithm> header here for sort.
                     //using <ext/hash_map> just for the sort functionality is not a great idea because it makes the code less clear and also creates portability issues.
using namespace __gnu_cxx;
using namespace std;

list<int> findDup(const vector<int>& A ,const vector<int>& B)
{
    list<int> idx;
    std::vector<int>::size_type i = 0;
    std::vector<int>::size_type j = 0;
    while(i < A.size() && j < B.size()) { //as pointed out before this is the source of the error
        if (A.at(i) == B.at(j)) 
        //using the .at(i) will throw an exception if anything goes out of range of the container. 
        //Operator [] doesn't provide this safety.
        {
            idx.push_back(A.at(i));
            i++;
            j++;
        }
        else if(A.at(i) < B.at(j))
        {
            i++;
        }
        else if (A.at(i) > B.at(j))
        {
            j++;
        }
    }

    return idx; 
    //you didn't actually return anything before

}

int main()
{
    int myintsA[]={1,3,3,2,2,5,5,5,4};
    int myintsB[]={0,9,8,6,7,3,3,4};

    vector<int> myvectorA (myintsA, myintsA + sizeof(myintsA) / sizeof(int) );
    vector<int> myvectorB (myintsB, myintsB + sizeof(myintsB) / sizeof(int) );


    sort(myvectorA.begin(),myvectorA.end());
    sort(myvectorB.begin(),myvectorB.end());

    list<int> result = findDup(myvectorA, myvectorB);
    for(list<int>::iterator iter = result.begin(); iter!=result.end();++iter)
    {
        cout<< *iter ; 
        //using cout is generally safer and more idiomatic c++
    }
            cout << endl;

    return 0;
}

Основная проблема - крайний случай, который происходит в конце.Несколько вещей, на которые стоит обратить внимание: если бы вы использовали синтаксис .at(i), вы бы получили бросок std :: out_of_range, который бы указывал вам правильное направление для поиска проблемы.Также, если вы скомпилировали с -Wall, вас бы предупредили о том, что первая функция ничего не возвращает.

2 голосов
/ 27 февраля 2011

Функция findDup имеет ошибку граничного условия: что если один из i или j находится в конце, а другой - нет?Ваш цикл будет продолжен, выходя за пределы вектора.Для того, что вы делаете, вы должны просто иметь возможность изменить условие цикла на (i != A.size()) && (j != B.size()) (изменив || на &&).

Другая проблема заключается в том, что формат %c предназначен для символов;%d для int s, и на вашем терминале будут странные результаты, если вы используете %c.Вы должны также напечатать (при условии, что вы хотите формат, который вы показываете в вопросе) левую фигурную скобку в начале списка вывода, запятые между выходными числами, а также правую фигурную скобку и символ новой строки в конце.Тим ответит также правильно;у вас также есть эта опечатка в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...