Как вернуть логическое значение из функции шаблона? - PullRequest
0 голосов
/ 02 февраля 2012

В следующем коде C ++ я хочу использовать функцию шаблона, чтобы определить, совпадают ли два вектора, но я всегда получаю значение false из функции шаблона.Не могли бы вы дать мне предложение о том, как вернуть логические значения из функции шаблона?(Мой компилятор C ++ - g ++ 4.6)

Редактировать: после pop_back оба p1 p2 p3 p4 результаты теперь сопоставляются с тем, что я ожидал.

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

template<class T> bool areTheyMatched(shared_ptr<vector<T>> p1, shared_ptr<vector<T>> p2) {
if ((*p1).size() == (*p2).size()) {
    cout << (*p1).size() << endl;
    for (unsigned int i = 0;  i < (*p1).size(); i++) {
      if ((*p1)[i] != (*p2)[i]) {
        cout << (*p1)[i] << " " <<  (*p2)[i] << endl;   
        return false;
          } 
        }
 } else {
    return false;
 }
 cout << "All elements are exactly the same" << endl;
 return true;
 }


 int main(int argc, char *argv[]) {
   shared_ptr<vector<int>> p1(new vector<int>);
   shared_ptr<vector<int>> p2(new vector<int>);
   shared_ptr<vector<double>> p3(new vector<double>);
   shared_ptr<vector<double>> p4(new vector<double>);
   for (int i = 0; i < 10; i++) 
     (*p1).push_back(i); 
   for (int i = 0; i < 9; i++) 
     (*p2).push_back(i);
   (*p2).push_back(11);
   for (double i = 0.0; i < 9.9; i += 1.1) 
      (*p3).push_back(i);
   for (double i = 0.0; i < 8.8; i += 1.1) 
      (*p4).push_back(i);
   (*p4).push_back(11.0);
   cout << "Case 1: " << areTheyMatched(p1, p2) << endl;
   (*p1).pop_back();
   (*p2).pop_back();
   cout << "Case 2: " << areTheyMatched(p1, p2) << endl;
   cout << "Case 3: " << areTheyMatched(p3, p4) << endl;
   (*p3).pop_back();
   (*p4).pop_back();
   cout << "Case 4: " << areTheyMatched(p3, p4) << endl;
   p1.reset();
   p2.reset();
   p3.reset();
   p4.reset();
   return 0;
}

Ответы [ 4 ]

6 голосов
/ 02 февраля 2012

Код шаблона выглядит нормально, но векторы испытаний просто никогда не бывают одинаковыми, не так ли.

Сначала они отличаются тем, что у одного из них есть элемент 11, а при удалении они имеют разные размеры.

2 голосов
/ 02 февраля 2012

Ваши векторы действительно разные.

   for (int i = 0; i < 10; i++) 
     (*p1).push_back(i); 
   for (int i = 0; i < 9; i++) 
     (*p2).push_back(i);
   (*p2).push_back(11);

p1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
p2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 11}
Case 1: false
(*p2).pop_back();
p1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
p2 = {0, 1, 2, 3, 4, 5, 6, 7, 8}
Case 2: false
1 голос
/ 02 февраля 2012

Ваша функция шаблона полностью в порядке ...

Причина, по которой вы получаете ложь, заключается в том, что ваши входные данные действительно отличаются, изначально по содержанию, а после всплывающего окна даже размер не совпадает.

Есть ли причина, по которой вы используете shared_ptr? Вы можете передать вектор & и если вам не нужны общие указатели по уважительной причине, вы не должны их использовать. Хотя они и являются лучшим способом передачи указателей, когда вам нужно обмениваться данными между многими объектами, они имеют дополнительные издержки.

0 голосов
/ 02 февраля 2012

Если вы примените код, вы увидите, что он работает правильно. Мне нужно было использовать std::tr1 и <tr1/memory> и > > вместо >>, чтобы заставить его компилироваться с G ++ 4.6.1, но это показывает, что оно работает:

#include <iostream>
#include <tr1/memory>
#include <vector>

using namespace std;
using namespace std::tr1;

template<class T> bool areTheyMatched(shared_ptr< vector<T> > p1, shared_ptr< vector<T> > p2)
{
    cout << "p1.size: " << (*p1).size() << ", p2.size: " << (*p2).size() << endl;
    if ((*p1).size() != (*p2).size())
        return false;
    for (unsigned int i = 0;  i < (*p1).size(); i++)
    {
        if ((*p1)[i] != (*p2)[i])
        {
            cout << "i = " << i << ": " << (*p1)[i] << " " <<  (*p2)[i] << endl;   
            return false;
        }
    }
    cout << "All elements are exactly the same" << endl;
    return true;
}

int main()
{
   shared_ptr< vector<int> > p1(new vector<int>);
   shared_ptr< vector<int> > p2(new vector<int>);
   shared_ptr< vector<double> > p3(new vector<double>);
   shared_ptr< vector<double> > p4(new vector<double>);
   for (int i = 0; i < 10; i++) 
     (*p1).push_back(i); 
   for (int i = 0; i < 9; i++) 
     (*p2).push_back(i);
   (*p2).push_back(11);
   for (double i = 0.0; i < 9.9; i += 1.1) 
      (*p3).push_back(i);
   for (double i = 0.0; i < 8.8; i += 1.1) 
      (*p4).push_back(i);
   (*p4).push_back(11.0);

   cout << "Case 1: " << areTheyMatched(p1, p2) << endl;
   (*p2).pop_back();
   cout << "Case 2: " << areTheyMatched(p1, p2) << endl;
   (*p1).pop_back();
   cout << "Case 2a: " << areTheyMatched(p1, p2) << endl;

   cout << "Case 3: " << areTheyMatched(p3, p4) << endl;
   (*p3).pop_back();
   cout << "Case 4: " << areTheyMatched(p3, p4) << endl;
   (*p4).pop_back();
   cout << "Case 4a: " << areTheyMatched(p3, p4) << endl;
   p1.reset();
   p2.reset();
   p3.reset();
   p4.reset();
   return 0;
}

выход

p1.size: 10, p2.size: 10
i = 9: 9 11
Case 1: 0
p1.size: 10, p2.size: 9
Case 2: 0
p1.size: 9, p2.size: 9
All elements are exactly the same
Case 2a: 1
p1.size: 10, p2.size: 10
i = 9: 9.9 11
Case 3: 0
p1.size: 9, p2.size: 10
Case 4: 0
p1.size: 9, p2.size: 9
All elements are exactly the same
Case 4a: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...