C ++ найти в векторе - PullRequest
0 голосов
/ 25 июля 2011

Я пытаюсь выполнить функцию, которая бы возвращала сообщение, в котором было найдено вхождение в векторе. Но мое возвращаемое значение всегда равно 0, и я уверен, что есть совпадение.

Вот код:

int findInItemvector(vector<Item> vec, string name)
{
    for(vector<Item>::iterator it = vec.begin(); it < vec.end(); it++)
    {
        if(it->getName() == name)
        {
            return it - vec.begin(); 
            break;
        }
        else
        {
            return 0;
        }

    }
}

Ответы [ 3 ]

6 голосов
/ 25 июля 2011

Когда ваш первый элемент не совпадает, ветвь else выполняет return, что оставляет функцию, а остальная часть вашего цикла не выполняется.Вы хотите что-то вроде:

int findInItemvector(vector<Item> vec, string name)
{
    for(vector<Item>::iterator it = vec.begin(); it < vec.end(); it++)
    {
        if(it->getName() == name)
        {
            return it - vec.begin(); 
        }
    }

    return 0;
}

Однако, поскольку первый элемент также может совпадать (в этом случае it - vec.begin() == 0), я предлагаю вам использовать другое защитное значение, такое как -1 (которое никогда не может бытьдействительный векторный индекс).

5 голосов
/ 25 июля 2011

Ваше предложение 'else' является проблемой: если первый элемент не совпадает, включается 'else', и ваш оператор 'return 0' вырывает вас из цикла 'for', не пытаясь ни одного издругие элементы в векторе.

Попробуйте избавиться от «else» и переместить «return 0» в после окончания цикла «for».

1 голос
/ 25 июля 2011

Ваша функция всегда будет возвращать 0 из-за того, как она написана в данный момент.Если в первом элементе вектора найдено совпадение, результат вычитания будет равен нулю.Если она не совпадает, другая часть выполняется и возвращает 0, и функция завершается.

Функция должна выглядеть примерно так:

int findInItemvector(const vector<Item>& vec, string name)
{
    for(vector<Item>::const_iterator it = vec.begin(); it < vec.end(); it++)
    {
        if(it->getName() == name)
        {
            return it - vec.begin(); 
        }
    }
  return -1;
}

Обратите внимание, что я передаю вектор поконстантная ссылка вместо значения, это предотвратит создание ненужной копии вектора при вызове этой функции.Кроме того, вы должны указать сбой, используя -1, а не 0, поскольку последний является допустимым результатом, если искомая строка находится в первом элементе вектора.

...