массив структур через vector.выдает ошибку. vector iterator not incrementable

210
04 марта 2017, 05:22
#include <iostream>
#include <conio.h>
#include <vector>
#include <stdio.h>
using namespace std;
struct treem 
{
char node[5];
char parent[5];
int number;
};
vector <treem> CreateAtree()
{
char value[5];
char parn[5];
int num;
vector<treem> tree;
treem g;

printf("Input the name of the root\n");
scanf("%s",&value);
printf("Input the value of node\n");
scanf("%d", &num);
tree.push_back(g);
strcpy(tree.at(0).parent,"NO");
strcpy(tree.at(0).node, value);
tree.at(0).number = num;
int i = 1;
int flag = 0;
while (num != 0 && parn[0] != '0')
{
    printf("Input the name of node\n");
    scanf("%s",&value);
    printf("Input the parent of node\n");
    scanf("%s",&parn);
    printf("Input the value of node\n");
    scanf("%d",&num);

    for (vector<treem>::iterator it = tree.begin(); it != tree.end(); it++)
    {
        if (strcmp(parn, it->node) == 0)
            flag = 1;
        if (flag == 1)
        {
            tree.push_back(g);
            strcpy(tree.at(i).parent, parn);
            strcpy(tree.at(i).node, value);
            tree.at(i).number = num;
            i++;
            flag = 0;
        }
        else
            printf("There is not such parent,please try again\n");
    }
}
return tree;
}
int main()
{
vector<treem> tree = CreateAtree();
_getch();
return 0;
}

Делаю что-то вроде дерева. Создаю корень тогда когда добавляю новую вершину и указываю корень(у меня там проверка идет) выбивает сообщение vector iterator not incrementable . С vector работаю впервые поэтому прошу совета как исправить.

Answer 1

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

for (vector<treem>::iterator it = tree.begin(); it != tree.end(); it++)
{
    if (strcmp(parn, it->node) == 0)
        flag = 1;
    if (flag == 1)
    {
        tree.push_back(g);
        ^^^^^^^^^^^^^^^^^

Что вам надо - это использовать алгоритм std::find_if или std::any_of вместо цикла, и, если родительский элемент найден, то добавлять новый элемент в вектор, после чего использовать функцию-член класса back для изменения значений данного добавленного элемента.

К тому же у вас в дереве нет связи между узлами дерева.

Ниже показано, как можно переписать ваш код, чтобы по крайней мере он работал.

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <limits>
#include <cstring>
const size_t N = 5;
struct treem
{
    char node[N];
    char parent[N];
    int number;
};
std::vector<treem> CreateAtree()
{
    std::vector<treem> tree;
    treem node;
    std::cout << "Input the name of the root: ";
    std::cin.getline(node.node, N);
    std::cout << "Input the value of node: ";
    std::cin >> node.number;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::strcpy(node.parent, "NO");
    tree.push_back(node);
    while (true)
    {
        std::cout << "Input the parent of the next node: ";
        if ( !std::cin.getline(node.parent, N) || node.parent[0] == '\0') break;
        if (std::any_of(tree.begin(), tree.end(),
            [&](const treem &t)
        {
            return std::strcmp(t.node, node.parent) == 0;
        }))
        {
            std::cout << "Input the name of the next node: ";
            std::cin.getline(node.node, N);
            std::cout << "Input the value of the next node: ";
            std::cin >> node.number;
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            tree.push_back(node);
        }
        else
        {
            std::cout << "There is no such parent,please try again\n";
        }
    }
    std::cout << std::endl;
    return tree;
}

int main()
{
    std::vector<treem> tree = CreateAtree();
    for (const treem &node : tree)
    {
        std::cout << "parent: " << node.parent
            << ", name: " << node.node
            << ", value: " << node.number
            << std::endl;
    }
    return 0;
}

Диалог с программой может выглядеть следующим образом

Input the name of the root: A
Input the value of node: 0
Input the parent of the next node: A
Input the name of the next node: B
Input the value of the next node: 1
Input the parent of the next node: A
Input the name of the next node: C
Input the value of the next node: 2
Input the parent of the next node: B
Input the name of the next node: D
Input the value of the next node: 3
Input the parent of the next node:
parent: NO, name: A, value: 0
parent: A, name: B, value: 1
parent: A, name: C, value: 2
parent: B, name: D, value: 3
READ ALSO
Дихотомия. Бин поиск

Дихотомия. Бин поиск

Имеется массив 1 и 0, размером N

232
ошибка java.lang.NullPointerException

ошибка java.lang.NullPointerException

Доброго времени суток! Учусь работать в среде netbeans IDE 81 на ubuntu

265
signed int vs unsigned int (undefined behaviour ситуации)

signed int vs unsigned int (undefined behaviour ситуации)

Если говорить просто и коротко, то меня интересует: количество и примеры undefined behaviour для каждого из этих типов

317
Получение минут и секунд из полного времени в виде строки

Получение минут и секунд из полного времени в виде строки

Есть функция _tctime которая форматирует число в строку следующего формата:

196