我正在尝试从输入中获取字符串向量以创建图形,但是我不知道为什么在我的代码中间它会崩溃。请帮助我修复它。我使用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++;
}
}
}
答案 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.