2010-06-04 6 views
1

J'ai une série de points \ positions qui ne changeront pas. Dois-je représenter en tant que vecteur d'ints ou en tant que nouveau type?Type ou vecteur pour représenter des points positions

Ma préférence au moment est d'aller avec le vecteur:

doSomething(myVec[0], myVec[1]); 
doSomethingElse(myVec[2], myVec[3]); 

par opposition à:

doSomething(myType.getPos1(), myType.getPos2()); 
doSomethingElse(myType.getPos3(), myType.getPos4()); 

Toutes les pensées ou des idées?

Merci

+0

Est-ce que la 'série de points' refléter le concept mathématique de vecteur? – xtofl

+0

Non, en fait, les positions seraient un terme plus approprié. –

Répondre

2

Puisque vous utilisez stl, j'utiliserais vector< pair<int,int> > (ou vector< pair<double,double> > si les points ne sont pas des nombres entiers). Cela fonctionne très bien pour les points.

Alors vous pourriez faire quelque chose comme ceci:

vector< pair<int,int> > points; 
points.push_back(make_pair(1,2)); 
points.push_back(make_pair(2,2)); 
+1

Je préférerais une structure ou même mieux une classe. L'utilisation d'une classe permet d'ajouter des méthodes, c'est-à-dire de calculer la distance (myPoint.DistanceTo (myOtherPoint);). L'utilisation d'une paire peut fonctionner, mais elle ne dit pas vraiment à quoi elle sert, quelle information est stockée et à quoi elle peut servir. – dbemerlin

+0

Je ne suis pas votre argument, pourquoi ne pas appairer dire quelles informations y sont stockées? Je veux dire, c'est une paire d'ints, combien plus clair doit-il être? Vous pouvez réellement combiner l'utilisation des deux idées, faire une structure avec la paire , puis ajouter d'autres méthodes pour calculer la distance, etc. – dcp

3

C'est difficile à dire avec les informations données. Mais avec toutes les informations fournies jusqu'à présent, je préférerais écrire struct Point avec x et y et créer un vector des points. Cela vous donnera les avantages de stocker les objets dans un conteneur standard et il liera logiquement les données dans une structure commune de sorte que vous ne devez pas vec[0],vec[1] chaque fois que vous voulez un point. Comme une note de côté, si vous écrivez la classe avec la méthode getPos je serais certainement écrire getPos(int index) plutôt que getPos1, getPos2 etc.

3

Pourquoi ne pas créer un struct vecteur réel/classe?

Par vecteur, je veux dire un vecteur mathématique. Typiquement, les vecteurs sont utilisés pour les points et les positions. Un bonus de ceci est que votre code sera beaucoup plus lisible.

Voici comment les jeux, les graphiques et d'autres applications le font. L'utilisation d'une liste pour les données connexes n'est pas OO, et l'une des raisons OOP existe.

+0

Est-ce que ça doit être OO? STL n'est pas OO non plus. –

+0

@Eddy certainement pas, cependant, lorsque vous faîtes des concepts OO dans un langage qui prend en charge la POO, c'est un problème. – Finglas

1

Si vous devez itérer sur eux, alors la réponse est évidente.

Si elles ne changent pas et que vous pouvez gérer la complexité, la première option est correcte. La seconde pourrait être plus lisible (si vous choisissez de bons noms).

Vous pouvez également écrire une classe qui contient ou contient une référence au vecteur. Dans ce cas, vous pouvez avoir les avantages des deux.

Vous pouvez également utiliser la bibliothèque Boost.tuple.

#include <boost/tuple/tuple.hpp> 

boost::tuple<int,int,int,int> position; 

et les accès comme:

position.get<N>(); // where N is in 1,2,3,4 
3

La solution à mon humble avis serait:

struct Point { 
    int x, y; 
}; 

[... ailleurs ...]

vector<Point> points(); 

(My C++ est rouillé, peut-être pas la syntaxe correcte)

+0

Je pense que cela serait plus clair dans le code. Alors si l'OP a besoin d'une sorte de performance, 3D ou je ne sais pas quel type de calcul mathématique, il y a des solutions comme l'a dit Finglas. – Nikko

Questions connexes