Как я могу разобрать вектор в bool в C ++? - PullRequest
0 голосов
/ 19 мая 2019

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

#include <iostream>
#include <vector>
#include <string>

bool isinVector(std::string uElement, std::vector<std::string> uArray)
{
    for (unsigned int i = 0; i <= sizeof(uArray); i++) {
        if (uArray[i] == uElement) {
            return true;
        }
        else {
            return false;
        }
    }
}

int main()
{
    bool trigger = false;
    while (!trigger) {
        std::vector<std::string> names;
        names.push_back("Bart");
        std::string newName;
        getline(std::cin, newName);
        if (isinVector(newName, names))
        {
            std::cout << "true" << std::endl;
            trigger = true;
        }
        else
        {
            std::cout << "false" << std::endl;
            names.push_back(newName);
            for (int i = 0; i <= sizeof(names); i++) {
                std::cout << names[i] << std::endl;
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 19 мая 2019

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

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using std::vector;
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::find_if;

int main(){
    bool trigger = false;
    while (!trigger) {

        vector<string> names;

        names.push_back("Bart");

        string newName;

        getline(cin, newName);

        if(find_if(names.begin(), names.end(), [newName] (const string& name){

            return !name.compare(newName);

        }) != names.end()){

            cout << "true" << endl;
            trigger = true;

        }

        else{

            cout << "false" << endl;
            names.push_back(newName);

            for (size_t i = 0; i < names.size(); i++) {

                cout << names.at(i) << endl;

            }
        }
    }

    return 0;
}

Код использует std :: find_if, чтобы проверить, существует ли элемент в векторе.Если std::find_f не возвращает итератор в uArray.end(), то элемент существует.Также для цикла for используется sizeof, что неверно, используйте метод vector.size.И вы зацикливались до <=, это должно быть < uArray.size() И безопаснее обращаться к элементам в векторе через метод .at, а не через индекс [], поскольку .at вызовет исключение out_of_range.

1 голос
/ 19 мая 2019

Среди вещей не так в обновленном посте.

  1. Неправильное использование sizeof
  2. Изобретая стандартный алгоритм
  3. Отсутствие проверки ошибок

Рассмотрите задачи, которые вы пытаетесь выполнить. Вы хотите:

  1. Инициализировать начальный вектор, содержащий имя Bart
  2. Постоянно читайте новые имена. Для каждого нового имени читать:

    а. Проверьте, находится ли он уже в векторе.

    • если он есть, завершить цикл чтения
    • иначе добавьте его к вектору и напечатайте весь вектор

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


Шаг 1. Чтение имен

Во-первых, вы должны иметь возможность постоянно читать имена:

#include <iostream>
#include <string>

int main()
{
    std::string name;
    while (std::getline(std::cin, name))
        std::cout << name << '\n';
}

Достаточно просто. Выполнение этого будет повторять любые строки, которые вы вводите, по одной, разделенные символами новой строки.

Шаг 2. Накопление имен в векторе

Далее нам нужно добавить вектор для хранения строк, которые мы читаем, с начальной популяцией имени «Барт». Для этого прохода мы будем просто помещать каждую строку, которую мы читаем, в вектор

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> names = { "Bart" };

    std::string name;
    while (std::getline(std::cin, name))
    {
        names.emplace_back(name);
        for (auto const& s : names)
            std::cout << s << ' ';
        std::cout.put('\n');
    }
}

В дополнение к тому, что было сделано ранее, мы теперь накапливаем строки в векторе, включая дубликаты, и отчитываемся о векторном содержимом после каждого чтения имени. Это приближает нас к нашей заявленной цели.

Шаг 3: Условный выход из цикла на основе обнаружения дубликатов

Теперь нам нужно проверить наличие дубликатов и завершить цикл, как только это произойдет. Мы можем сделать это используя std::find. Финальный код ниже:

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> names = { "Bart" };

    std::string name;
    while (std::getline(std::cin, name))
    {
        if (std::find(names.begin(), names.end(), name) != names.end())
            break;

        names.emplace_back(name);
        for (auto const& s : names)
            std::cout << s << ' ';
        std::cout.put('\n');
    }
}

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

Надеюсь, вы нашли это полезным.

0 голосов
/ 19 мая 2019

Теперь мой код выглядит так:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>



bool isinVector (std::string uElement, std::vector<std::string> uArray) {
    bool invector = false;
    std::vector<std::string>::iterator it = std::find(uArray.begin(), 
    uArray.end(),uElement);
    if(it != uArray.end()){
        invector = true;
    }
    return invector;
}


int main(){
    bool trigger = false;
    std::string name;
    std::vector<std::string> names = { "Bart" };
    while (std::getline(std::cin, name)){
        if (isinVector(name, names)) {
            std::cout << "true" << std::endl;
            break;
        }
        else
        {
            std::cout << "false" << std::endl;
            names.emplace_back(name);
        }
    }
    return 0;
}

и это работает, спасибо большое, ребята!

...