我一直致力于平衡化学方程式的程序。我有它所以它根据=
将方程分为两个方面。我正在处理我的程序而且我做了一些事情,现在当我尝试将std::vector<std::string>
的第一个索引设置为我的等式的substr
时,我遇到了运行时错误。我需要帮助解决这个问题。
std::vector<std::string> splitEquations(std::string fullEquation)
{
int pos = findPosition(fullEquation);
std::vector<std::string> leftAndRightEquation;
leftAndRightEquation.reserve(2);
leftAndRightEquation[0] = fullEquation.substr(0, (pos)); //!!!! Error
leftAndRightEquation[1] = fullEquation.substr( (pos+1), (fullEquation.size() - (pos)) );
removeWhiteSpace(leftAndRightEquation);
std::cout << leftAndRightEquation[0] << "=" << leftAndRightEquation[1] << std::endl;
return leftAndRightEquation;
}
这是findPosition
的代码。
int findPosition(std::string fullEquation)
{
int pos = 0;
pos = fullEquation.find("=");
return pos;
}
答案 0 :(得分:2)
错误不在substr
上,而是在矢量operator[]
上。当您尝试在索引0和1处分配时,向量仍为空。如果需要,它有两个保留用于扩展,但其“有效区域”的大小为零;访问它会导致错误。
您可以使用push_back
来解决问题,例如:
leftAndRightEquation.push_back(fullEquation.substr(0, (pos)));
leftAndRightEquation.push_back(fullEquation.substr( (pos+1), (fullEquation.size() - (pos)) ));
答案 1 :(得分:1)
将reserve()
更改为resize()
,它会起作用。在所有其他情况下,reserve()
调用不会导致重新分配,并且矢量容量不会受影响,但resize()
会影响。
答案 2 :(得分:1)
会员职能reserve
leftAndRightEquation.reserve(2);
类std::vector
的不会创建向量的元素。它只是为将来添加到向量的元素保留内存。
因为向量没有元素,所以你可能不会使用下标运算符。而不是它你必须使用成员函数push_back
另外,可以更简单地指定第二个子字符串。
leftAndRightEquation.push_back( fullEquation.substr( 0, pos ) );
leftAndRightEquation.push_back( fullEquation.substr( pos + 1 ) );
substr
的成员函数class std::basic_string
按以下方式声明
basic_string substr(size_type pos = 0, size_type n = npos) const;
它有两个带默认参数的参数。
如果你想使用下标运算符,那么你最初应该创建带有两个元素的向量。您可以通过以下方式执行此操作
std::vector<std::string> leftAndRightEquation( 2 );
之后你可以写
leftAndRightEquation[0] = fullEquation.substr( 0, pos );
leftAndRightEquation[1] = fullEquation.substr( pos + 1 );