如何使用枚举将char值映射到int

时间:2019-06-01 04:30:47

标签: c++ c++11 c++14

我正在尝试使用枚举将字符串中的一些字符映射到一些整数值。请告诉我我要去哪里错了?

enum moves{U,R,D,L};
class Solution {
public:
    bool judgeCircle(string moves) {   

// moves is a string having values like ULLDDRR, ULRD, UULLDDRR 
        int X[] = {0,1,0,-1};
        int Y[] = {1,0,-1,0};

// while iterating the string if a get 'U' , I want it to use as an index 
//with  U representing 0th index, R as index=1 and so on.. as in enum

        int x=0 , y=0;
        enum moves ind;
        for( int i = 0 ; i < moves.length() ; i++ ) {
            ind = moves[i];  // but this line here gives error
            x += X[ind];
            y += Y[ind];
        }

        if(!x && !y)
            return true;
        else
            return false;
    }
};

1 个答案:

答案 0 :(得分:2)

我会用enum放弃这个想法,因为我觉得它对实际的问题没有用-将字符映射到导航动作。为此,我将使用std::mapstd::unordered_map。 (考虑到只有4个条目,性能差异可能很难衡量。)

在我准备示例代码时,πάντα ῥεῖ给出了类似的提示。不过,我什至建议将x和y的动作捆绑在一起:

#include <map>
#include <iomanip>
#include <iostream>

// bundle x and y for a move (which needs both of them)
struct Move {
  int dx, dy;
};

// a type to map chars to moves
using MoveMap = std::map<char, Move>;

// a pre-defined move map
static const MoveMap mapMoves = {
    { 'U', { 0, 1 } },
    { 'R', { 1, 0 } },
    { 'D', { 0, -1 } },
    { 'L', { -1, 0 } }
};

/* a function to use move map
 *
 * id ... one of U R D L
 * x, y ... coordinates (update)
 * return: true if successful, (false e.g. for wrong id)
 */
bool move(char id, int &x, int &y)
{
  const MoveMap::const_iterator iter = mapMoves.find(id);
  return iter != mapMoves.end()
    ? x += iter->second.dx, y += iter->second.dy, true
    : false;
}

// check it out:

int main()
{
  int x = 0, y = 0;
  const char test[] = "ULLDDRR, ULRD, UULLDDRR";
  for (char id : test) {
    std::cout << "(" << x << ", " << y << "): "
      << "Move '" << id << "' -> ";
    if (move(id, x, y)) {
      std::cout << "(" << x << ", " << y << ")\n";
    } else std::cout << "failed\n";
  }
  return 0;
}

输出:

(0, 0): Move 'U' -> (0, 1)
(0, 1): Move 'L' -> (-1, 1)
(-1, 1): Move 'L' -> (-2, 1)
(-2, 1): Move 'D' -> (-2, 0)
(-2, 0): Move 'D' -> (-2, -1)
(-2, -1): Move 'R' -> (-1, -1)
(-1, -1): Move 'R' -> (0, -1)
(0, -1): Move ',' -> failed
(0, -1): Move ' ' -> failed
(0, -1): Move 'U' -> (0, 0)
(0, 0): Move 'L' -> (-1, 0)
(-1, 0): Move 'R' -> (0, 0)
(0, 0): Move 'D' -> (0, -1)
(0, -1): Move ',' -> failed
(0, -1): Move ' ' -> failed
(0, -1): Move 'U' -> (0, 0)
(0, 0): Move 'U' -> (0, 1)
(0, 1): Move 'L' -> (-1, 1)
(-1, 1): Move 'L' -> (-2, 1)
(-2, 1): Move 'D' -> (-2, 0)
(-2, 0): Move 'D' -> (-2, -1)
(-2, -1): Move 'R' -> (-1, -1)
(-1, -1): Move 'R' -> (0, -1)
(0, -1): Move '' -> failed

Live Demo on coliru