2012-09-28 4 views
0

문자열의 벡터를 할당 문의 rvalue가되도록 변환하는 효율적인 방법이 없다고 생각합니다. 그래서 예를 들어, 내가 세 가지 요소와 벡터가 "5", "*", "3"그래서 내가 필요한 것은 사전에 다음과 같은문자열의 벡터를 할당문의 Rvalue로 변환

int myInteger = 5 * 3; 

감사 기본적으로 동일하다 할당 문이다;

답변

0

요소별로 구문 분석해야합니다. 의 당신이 당신의 벡터가 세 가지 요소 (문자열)있을 것이라는 점을 알고 가정하자, 그래서 당신은 할 수 :

vector<string> v = {"5","*", "3"}; 
int x, y; 
char c; 
stringstream(a); 
string T = v[0]+v[1]+v[2]; 
a << T; 
a >> x >> c >> y; 

을 지금 당신은 작업이 C에서 무엇인지 확인하고를 수행해야합니다.

1

변수의 순서를 알고 있거나 변수의 순서와 연산자의 순서를 결정할 수 있다고 가정합니다. 당신이 벡터를 사용하고 있기 때문에, 여러 변수가있을 수 있다고 가정합니다. (요점은 아닙니다 :)).

이 경우 변수를 전송하고 연산자를 올바른 순서 (언어의 연산자 우선 순위에 지정된대로)로 적용하기위한 논리를 작성하기 만하면됩니다.

자바 스크립트 (see precedence here)를 사용한다고 가정합니다. 단순화를 위해 승산, 나누기, 더하기 및 빼기 연산자 만 처리합니다.

<script> 
var foo = 5*4+16/2-3*2; //should be 22 
var bar = ["5","*","4","+","16","/","2","-","3","*","2"]; 
var done = parseVec(bar); //should calculate to 22 

//there are no vectors in javascript, so we'll go with an array to demonstrate 
//all parsing assumes that values in the array are in decimal, not octal or hex 
function parseVec (array) { 
    var result, i, h, j, action; 
    var newarray = []; 

    //decision based on order of operations...all multiplication will happen 
    //first, then division, then addition, etc... 
    if (array.indexOf("*") > 0 && array.indexOf("*") < (array.length-1)) { 
    i = array.indexOf("*"); 
    action = "*"; 
    } else if (array.indexOf("/") > 0 && array.indexOf("*/") < (array.length-1)) { 
    i = array.indexOf("/"); 
    action = "/"; 
    } else if (array.indexOf("+") > 0 && array.indexOf("+") < (array.length-1)) { 
    i = array.indexOf("+"); 
    action = "+"; 
    } else if (array.indexOf("-") > 0 && array.indexOf("-") < (array.length-1)) { 
    i = array.indexOf("-"); 
    action = "-"; 
    } else 
    return useParseFloat(array[0]) ? parseFloat(array[0], 10) : parseInt(array[0], 10); 

    //operate on the value preceding and following array[i]... 
    h = useParseFloat(array[i-1]) ? parseFloat(array[i-1], 10) : parseInt(array[i-1], 10); 
    j = useParseFloat(array[i+1]) ? parseFloat(array[i+1], 10) : parseInt(array[i+1], 10); 
    switch (action) 
    { 
    case "*": 
     result = h * j; 
     break; 
    case "/": 
     result = h/j; 
     break; 
    case "+": 
     result = h + j; 
     break; 
    case "-": 
     result = h - j; 
     break; 
    } 

    //recreate the array for recursion 
    for(var i2 = 0; i2 < array.length; i2++) 
    { 
    if (i2 == i) 
     newarray.push(result.toString()); 
    else if (i2 != (i-1) && i2 != (i+1)) 
     newarray.push(array[i2]); 
    } 
    return parseVec(newarray); 
} 

//should I parse this as an int or float? 
function useParseFloat(val) { 
    return (val.indexOf(".") >= 0 && val.indexOf(".") < (val.length-1)) ? true : false; 
} 
</script> 

당신은 run this code on JSBin을 할 수 있습니다.

이것은 주어진 작업을 수행하는 방법에 대한 올바른 아이디어를 제공합니다. 약간의 놀기와 땜질로, 괄호뿐만 아니라 대부분의 연산자에 대한 지원을 포함 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. (특히 Java가 전혀 없다는 것을 잘 알고 있습니다.) 나는 벡터의 모든 요소를 ​​하나의 문자열로 연결하는 줄에서 생각하고있었습니다. . 그 문자열을 rvalue로 변환하는 방법을 찾으십시오. 또한 작업 순서는 항상 벡터의 인덱싱을 따르고 괄호도 그 위치에 있다는 점을 언급해야합니다. – Jeanno

+0

당신은 기본적으로 런타임 컴파일러를 작성하고 있습니다.이 컴파일러는 주어진 피연산자에 대해 수행 할 연산을 알아 내기 위해 문자열을 선택해야합니다. 벡터를 문자열로 연결하면 연산자와 피연산자로 다시 구문 분석하면됩니다. 사실 그대로있는 것이 더 빠릅니다. –

관련 문제