문자열의 벡터를 할당 문의 rvalue가되도록 변환하는 효율적인 방법이 없다고 생각합니다. 그래서 예를 들어, 내가 세 가지 요소와 벡터가 "5", "*", "3"그래서 내가 필요한 것은 사전에 다음과 같은문자열의 벡터를 할당문의 Rvalue로 변환
int myInteger = 5 * 3;
감사 기본적으로 동일하다 할당 문이다;
문자열의 벡터를 할당 문의 rvalue가되도록 변환하는 효율적인 방법이 없다고 생각합니다. 그래서 예를 들어, 내가 세 가지 요소와 벡터가 "5", "*", "3"그래서 내가 필요한 것은 사전에 다음과 같은문자열의 벡터를 할당문의 Rvalue로 변환
int myInteger = 5 * 3;
감사 기본적으로 동일하다 할당 문이다;
요소별로 구문 분석해야합니다. 의 당신이 당신의 벡터가 세 가지 요소 (문자열)있을 것이라는 점을 알고 가정하자, 그래서 당신은 할 수 :
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에서 무엇인지 확인하고를 수행해야합니다.
변수의 순서를 알고 있거나 변수의 순서와 연산자의 순서를 결정할 수 있다고 가정합니다. 당신이 벡터를 사용하고 있기 때문에, 여러 변수가있을 수 있다고 가정합니다. (요점은 아닙니다 :)).
이 경우 변수를 전송하고 연산자를 올바른 순서 (언어의 연산자 우선 순위에 지정된대로)로 적용하기위한 논리를 작성하기 만하면됩니다.
자바 스크립트 (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을 할 수 있습니다.
이것은 주어진 작업을 수행하는 방법에 대한 올바른 아이디어를 제공합니다. 약간의 놀기와 땜질로, 괄호뿐만 아니라 대부분의 연산자에 대한 지원을 포함 할 수 있습니다.
답장을 보내 주셔서 감사합니다. (특히 Java가 전혀 없다는 것을 잘 알고 있습니다.) 나는 벡터의 모든 요소를 하나의 문자열로 연결하는 줄에서 생각하고있었습니다. . 그 문자열을 rvalue로 변환하는 방법을 찾으십시오. 또한 작업 순서는 항상 벡터의 인덱싱을 따르고 괄호도 그 위치에 있다는 점을 언급해야합니다. – Jeanno
당신은 기본적으로 런타임 컴파일러를 작성하고 있습니다.이 컴파일러는 주어진 피연산자에 대해 수행 할 연산을 알아 내기 위해 문자열을 선택해야합니다. 벡터를 문자열로 연결하면 연산자와 피연산자로 다시 구문 분석하면됩니다. 사실 그대로있는 것이 더 빠릅니다. –