如何从输入中获取字符串向量?

时间:2019-12-16 12:57:16

标签: c++ visual-c++ iterator

我正在尝试从输入中获取字符串向量以创建图形,但是我不知道为什么在我的代码中间它会崩溃。请帮助我修复它。我使用Visual Studio。

#include <iostream>
#include <vector>
#include <iterator>

void main(void)
{
    {
        using namespace std;
        int8_t n{ 0 };
        cout << "enter the size of graph : ";
        cin >> n;
        vector<string> graph(n);
        string connectionsWith;
        vector<string>::iterator i;
        string::iterator e;
        int p{ 0 };
        for (i = graph.begin(); i != graph.end(); ++i)
        {
            cout << '\n' << "enter the vertices that are connected to " << p << " : ";
            cin >> connectionsWith;
            graph.push_back(connectionsWith);
            p++;
        }
        p = 0;
        for (i = graph.begin(); i != graph.end(); ++i)
        {
            cout << p << " is connected to " << *i;
            p++;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

在图的构造函数中,您分配n个字符串。在循环内,您可以在构造的n个字符串的顶部添加内容,并通过推回添加n个字符串。正如ChrisMM所说,这可能会使您的迭代器无效,这也不是实现这种情况的最有效方法。

因此,作为解决方案,而不是

vector<string> graph(n);

vector<string> graph;
graph.reserve(n);

并遍历索引,例如从0到n,然后往回推。

特别是在第一个循环中,您根本没有取消引用迭代器,这表明使用基于索引的循环会更好地显示您的意图。

答案 1 :(得分:0)

life_steal 指出了问题所在。我想补充一些信息和其他解决问题的方法。

int8_t n{ 0 }; 

vector<string> graph(n); // Here initialization happening with ASCII. If input is "1" then it would be "49". Consider changing int8_t to int if you unaware of that. 

graph.push_back(connectionsWith); //Instead of this line Use: *i = connectionsWith; it directly assign the value.