2014-10-16 3 views
1

Я пишу программу для уравновешивания химических уравнений. Программа работает, беря строку уравнения, разбивая ее на std :: vector с размером двух на основе знака равенства, затем анализирует левую сторону separatedEquation[0] и правую сторону separatedEquation[1] в другой набор std :: vector leftHalf и rightHalf соответственно.Назначить std :: векторный адрес другого std :: vector

Проблема

У меня есть функция Equation :: filterEquation, который анализирует separatedEquation для имен элементов. Я хочу использовать временный вектор, указывающий на адрес либо leftHalf, либо rightHalf. Я знаю, что это, вероятно, сбивает с толку, но вот мой код и то, что я пытаюсь сделать. Я думаю, мне нужно использовать указатели, но мне никогда не приходилось использовать указатели раньше и неэффективны с ними.

void Equation::filterEquation() 
{ 
    for(int i=0; i<separatedEquation.size(); i++) //i = index of separated equation 
    { 
     int index=0; 
     std::vector<std::string> equationHalf; 
     if(i==0) 
      equationHalf = leftHalf; //set equationHalf to the address of leftHalf 
     if(i==1) 
      equationHalf = rightHalf; //set equationHalf to the address of rightHalf 
     for (std::string::iterator it = separatedEquation[i].begin(); it!=separatedEquation[i].end(); ++it, index++) 
     { 
      //Elements are set up so that He = Helium, while H = Hydrogen. This separates the elements based upon upper and lowercae 
      bool UPPER_LETTER = isupper(separatedEquation[i][index]); //true if character is upperCase 
      bool NEXT_LOWER_LETTER = islower(separatedEquation[i][index+1]); //true if next is lowerCase 
      if (UPPER_LETTER)// if the character is an uppercase letter 
      { 
       if (NEXT_LOWER_LETTER) 
       { 
        std::string temp = separatedEquation[i].substr(index, 2);//add THIS capital and next lowercase 
        equationHalf.push_back(temp); // add temp to vector 
       } 

       else if (UPPER_LETTER && !NEXT_LOWER_LETTER) //used to try and prevent number from getting in 
       { 
        std::string temp = separatedEquation[i].substr(index, i); 
        equationHalf.push_back(temp); 
       } 
      } 
     } 
    } 

} 
+0

Два оператора 'if', которые перегружают' equationHalf' в начале сегмента кода, кажется неправильным. – sircodesalot

+0

@sircodesalot Я знаю, но я не могу придумать другого способа сделать это. У меня были два оператора if, настроенные таким образом: 'if (i == 0) {leftHalf.doSomething()}' и 'if (i == 1) {rightHalf.doSomething()}. Я думал, что вместо этого можно переопределить адрес уравненияHalf. – Crysis

+2

Хорошо, что вы написали, возможно, не так, потому что либо 'equationHalf' всегда будет * быть' rightHalf' ('if i == 0'), либо ничего не будет (если' i! = 0 '). – sircodesalot

ответ

4

В общем смысле вы бы заменить:

std::vector<std::string> equationHalf; 

... 

equationHalf = leftHalf // same for rightHalf 

с

std::vector<std::string>* equationHalf; 

... 

equationHalf = &leftHalf // same for rightHalf 

И затем заменить любой экземпляр equationHalf. с equationHalf->.

Хотя, в вашем случае, я мог бы серьезно рассмотреть ваш дизайн, например, вспыхивают код, что операции по equationHalf в функции и передавая ему ссылку на vector работать на таких, как void doStuff(std::vector<std::string> & equationHalf), просто называя doStuff(leftHalf) и doStuff(rightHalf).

+1

'std :: vector & equationHalf = ((i == 0)? LeftHalf: rightHalf);' будет работать, если второй тест для 'i == 0' на самом деле является опечаткой и' i! = 0' был предназначен. – WhozCraig

+0

@WhozCraig Я исправил свой код. Я на самом деле имел в виду 'i == 1', но этот вектор никогда не будет иметь размер больше 2, так что это будет работать. Поскольку 'std :: vector separEquation' никогда не будет содержать более 2 строк, лучше ли это сделать массив? – Crysis

+0

@Crysis см. Мой комментарий ниже вашего вопроса. – WhozCraig

Смежные вопросы