C++ 无法进入while循环。这与使用无序地图有关吗?

C++ 无法进入while循环。这与使用无序地图有关吗?,c++,loops,c++11,enums,hashmap,C++,Loops,C++11,Enums,Hashmap,我试图做一个编码挑战,我们必须缩短和减少方向指示。在实现while循环之前,我使用的是无序映射。代码的其余部分按预期工作,但无法到达while循环,因此无法输出适当的值 std::vector<std::string> dirReduc(std::vector <std::string>& arr) { enum Direction { NORTH = 1, SOUTH = -1, EAST = 1, WEST =

我试图做一个编码挑战,我们必须缩短和减少方向指示。在实现while循环之前,我使用的是无序映射。代码的其余部分按预期工作,但无法到达while循环,因此无法输出适当的值

std::vector<std::string> dirReduc(std::vector <std::string>& arr)
{
    enum Direction
    {
        NORTH = 1, SOUTH = -1,
        EAST = 1, WEST = -1
    };
    int x=0, y=0;
    std::unordered_map<std::string, Direction> uMapDir = { {"North",NORTH},{"NORTH",NORTH},
                                                        {"South",SOUTH},{"SOUTH",SOUTH},
                                                        {"East",EAST},{"EAST",EAST},
                                                        {"West",WEST},{"WEST",WEST} };
    for (std::vector<std::string> ::const_iterator i =arr.begin(); i!=arr.end() ; i ++)
    {
        if ((*i=="North")||(*i == "NORTH")||(*i=="South")|| (*i == "SOUTH"))
        {
            y += uMapDir[*i];
        }
        else
        {
            x += uMapDir[*i];
        }
    }
    std::vector<std::string> outPutArr;
    while ((x!=0)&&(y!=0))
    {
        if (x<0)
        {
            x++;
            outPutArr.push_back("WEST");
        }
        else
        {
            x--;
            outPutArr.push_back("EAST");
        }

        if (y < 0)
        {
            y++;
            outPutArr.push_back("SOUTH");
        }
        else
        {
            y--;
            outPutArr.push_back("NORTH");
        }
    }
    return outPutArr;
}
std::vector dirreduce(std::vector&arr)
{
枚举方向
{
北=1,南=1,
东=1,西=1
};
int x=0,y=0;
无序地图uMapDir={{“北”,北},{“北”,北},
{“南”,南},{“南”,南},
{“东”,东},{“东”,东},
{“西”,西},{“西”,西};
for(std::vector::const_迭代器i=arr.begin();i!=arr.end();i++)
{
如果((*i==“北”)| |(*i==“北”)| |(*i==“南”)| |(*i==“南”))
{
y+=uMapDir[*i];
}
其他的
{
x+=uMapDir[*i];
}
}
std::向量输出;
而((x!=0)和&(y!=0))
{

如果(x你的问题是你试图在同一个循环中同时执行
x
y
。这意味着每个循环都必须
向后推
一个东或西
向后推
一个南或北。但这没有任何意义。如果每个循环的数量都不相同呢

相反,您应该使用两个循环:

while (x)
{
    if (x<0)
    {
        x++;
        outPutArr.push_back("WEST");
    }
    else
    {
        x--;
        outPutArr.push_back("EAST");
    }
}

while(y) {
    if (y < 0)
    {
        y++;
        outPutArr.push_back("SOUTH");
    }
    else
    {
        y--;
        outPutArr.push_back("NORTH");
    }
}
while(x)
{

如果(x你的问题是你试图在同一个循环中同时执行
x
y
。这意味着每个循环都必须
向后推
一个东或西
向后推
一个南或北。但这没有任何意义。如果每个循环的数量都不相同呢

相反,您应该使用两个循环:

while (x)
{
    if (x<0)
    {
        x++;
        outPutArr.push_back("WEST");
    }
    else
    {
        x--;
        outPutArr.push_back("EAST");
    }
}

while(y) {
    if (y < 0)
    {
        y++;
        outPutArr.push_back("SOUTH");
    }
    else
    {
        y--;
        outPutArr.push_back("NORTH");
    }
}
while(x)
{

如果(XBooff:把所有输入转换成一个单独的情况,那么你必须处理更少的测试。注意:对于这样少的元素,<代码> unordeDeMAP 可能比线性搜索慢。特别是当你考虑<代码>如果((* i==“北方”)*(*i==“北”)*(*i==“南”)*(* i==“南”))
已经完成了大部分工作。@user4581301测试用例包括两个变量,你是说如果语句可以的话,嵌套会更快。
无序映射
更聪明,但是这些智能需要克服启动成本。我会用
无序映射
来实现类似的代码更简单,但它将是一个字符串到在找到字符串时要调用的函数的映射。这意味着您只有一次查找,该函数将为该特定方向执行所有其他工作。建议:将所有输入转换为一个单独的大小写,以便您必须处理较少的测试。注意:对于如此少的元素,
无序的\u映射
可能比线性搜索慢,特别是当你考虑<代码>如果((* i==“北”)*(*i==“北方”)*(*i==“南”)*(* i==“南”))
已经完成了大部分工作。@user4581301测试用例包括两个变量,你是说如果语句可以的话,嵌套会更快。
无序映射
更聪明,但是这些智能需要克服启动成本。我会用
无序映射
来实现类似的代码更简单,但它将是一个字符串到在找到字符串时要调用的函数的映射。这意味着您只需进行一次查找,该函数将为该特定方向执行所有其他工作。