我尝试了以下算法来查找给定向量的幂集
std::vector<std::string> *NFAStates
std::vector<std::string> *PowerSet
int state_lines = (*NFAStates).size()
for (int i = 1; i < pow(2, state_lines); i++)
{
for (int j = 0; j < state_lines; j++)
{
if (i &(1 << j) && !(*PowerSet)[i].empty())
{
(*PowerSet)[i].append("_");
(*PowerSet)[i].append((*NFAStates)[j]);
}
else if (i &(1 << j) && (*PowerSet)[i].empty())
(*PowerSet).push_back((*NFAStates)[j]);
}
std::cout << (*PowerSet)[i] << std::endl;
}
return 0;
我收到错误&#34;矢量下标超出范围&#34;
这里* NFAStates由
组成S0
S1
S2
和* PowerSet是我的powerset元素存储的地方
如果我知道为什么会收到此错误,那将非常有用
答案 0 :(得分:0)
我已经用最少的mod测试了你的代码,即我改变了对引用的指针。我发现没有错。
问题出在其他地方,可能是在输入向量的初始化中。
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
该程序值得注意的是,当PowerSet最初为空时会出现错误。
在循环之前添加#include <string>
#include <vector>
int func(std::vector<std::string>& NFAStates, std::vector<std::string> &PowerSet)
{
int state_lines = NFAStates.size();
//for (int i = 1; i < pow(2, state_lines); i++)
for (int i = 1; i < (1 << state_lines); i++) // this is more effective for powers of 2
{
for (int j = 0; j < state_lines; j++)
{
if (i &(1 << j) && !PowerSet[i].empty()) // <-- can't access [i] if PowerSet is empty.
{
PowerSet[i].append("_");
PowerSet[i].append(NFAStates[j]);
}
else if (i &(1 << j) && PowerSet[i].empty())
PowerSet.push_back(NFAStates[j]);
}
std::cout << PowerSet[i] << std::endl; // <-- can't access [i] if PowerSet is empty.
}
return 0;
}
int main()
{
std::vector<std::string> NFAStates{ "S0", "S1", "S2" };
std::vector<std::string> PowerSet{"0", "1", "2", "3", "4", "5", "6", "7" };
return func(NFAStates, PowerSet);
}
可能会解决您的问题吗?