在C ++中从输入创建2D向量

时间:2010-11-12 00:08:24

标签: c++ string vector

快速提问。我想知道如何从用户输入创建2D矢量。对于一个项目,我将我的“板”存储为2D矢量,用户将输入它的高度和宽度,以及或许起始配置。

如果我的电路板存储为:

vector<vector<int> > myBoard( width, vector<int> (height) ); 
//Not sure how to get width and height from input...

我需要将其初始化为给定的参数并且(如果用户提供信息),请填写板块。用户将通过1 cin在1行输入所有这些信息。就这样......

Please type the board config: 3 3

Please type the board config: 3 3 . . . . . . X . O

Please type the board config: 3 3 ABFDFL($%$

最后一个是输入错误的例子。第一个例子将创建一个2D矢量,3乘3。第二个例子将创建一个2D矢量,3乘3,并填充给定位置的板。在这种情况下, ”。”是0,“X”是1,“O”是-1。 这是我遇到的最麻烦的部分。我可以将它存储到一个字符串中,但似乎经过并解析它会对屁股感到痛苦......

6 个答案:

答案 0 :(得分:2)

我会尝试从用户输入推断尺寸。

示例会话:

A board consists of characters ., X or O.
An example board:
.XO
...
X..

Enter the board, end with two Returns:
.....
..XO.
.XXX.
OOOOO
.....

然后你会扫描第一行找到宽度,检查每一行是否有效字符和相同的宽度,并计算行数以找到高度。

答案 1 :(得分:1)

你可以使用一个映射,其中键是从cin读取的std :: board板坐标对作为整数。然后,值表示可以是int或char,并且可以轻松访问。然后你可以做像......这样的事情。

if(board[std::pair(x,y)] == '.')
  //do something;

答案 2 :(得分:1)

为了天国的缘故,已经解析了它!如果您允许的只是'。','X'和'O',那么基本上您所要做的就是跳过空格。 (如果您喜欢您的用户,您也可以考虑允许使用小写字母。)

答案 3 :(得分:0)

  

我可以将它存储到字符串中,但它   似乎经历和解析   这对屁股来说会很痛苦......

为什么呢?这是一个if / else链或switch

迟早你会厌倦管理矢量矢量。我会将整个电路板放在一个向量中并对其进行寻址y * width + x。它甚至可能在未来成为它自己的一类:

Piece board::getPieceAt(int x, int y) const
{
    ...
}

答案 4 :(得分:0)

可能导致方轮的伪代码。

getline( cin, board );  

find location of first space: board.find( ' ' );  
assign this to size_t height  
extract the digit(s) to a sting (or vector?): board.substr( 0, height )  
atoi this string for the height  
cut this from the string: board = board.substr( height )  
repeat for width  
initialize the realBoard vector with width and height  

if board still has chars, start filling the board  
initialize two ints for the vector coordinates  
initialize another for putting numbers onto the board  

until you get to the end of board  
send board[ i ] to a switch  
as you said, o/O = -1; x/X = 1; ./default = 0  
(unless you want bad input to interrupt execution)  
put the value into realBoard[ h ][ w ]  
add one to w;  
if it is above width, make it 0, add one to h  
if h > height, stop this function  

答案 5 :(得分:0)

这是一个使用cin及其机制的方法:

#include <stdio.h>
#include <iostream>
#include <vector>
#include <limits>
#include <ctype.h>


using namespace std;


int main(){
    int x;
    int y;
    bool done = false;

    vector< int > inputs;
    char holdValue;


    while ( !done )
    {
        inputs.clear();
        cout << "Enter Data:" << endl; //something more descriptive then then this
        cin >> x >> y;
        if(cin.fail())
        {
            cin.clear();
            cin.ignore( std::numeric_limits<std::streamsize>::max(),'\n' );
            cout << "Error with your input" << endl;
            continue;
        }

        int i = 0;
        bool error = false;
        for ( ;  i < ( x * y ) && error != true ; ++i )
        {
            cin >> holdValue;
            if(cin.fail())
            {
                cin.clear();
                cin.ignore( std::numeric_limits<std::streamsize>::max(),'\n' );
                cout << "Error with your input" << endl;
                error = true;
            }
            switch( toupper( holdValue ) )
            {
                case 'X':
                    inputs.push_back( 1 );
                    break;

                case 'O':
                    inputs.push_back( -1 );
                    break;

                case '.':
                    inputs.push_back( 0 );
                    break;

                default:
                    cin.ignore( std::numeric_limits<std::streamsize>::max(),'\n' );
                    cout << "Error with your input" << endl;
                    error = true;
                    break;
            }
        }

        if( i >= ( x * y )  && error != true )
        {
            done = true;
        }
    }

    //At this piont you have a vector to do with as you please

}

但是,你可以将它读入std :: string并编写一个解析器并将其解决。如果输入错误,如果速度更快,并且更容易分配你想要的东西。