Comment accéder à l'index d'un vecteur 2D par à() de la fonction?
Je vais initialiser un vecteur 2D dans une fonction membre, où les arguments d'entrée sont prévus pour être alimentés en a déterminé les indices à l'intérieur de l'argument de fonction.
En outre, je ne vais pas utiliser l'opérateur [] à l'accès des membres en raison de la sécurité des aliments.
Comment puis-je utiliser en fonction de() pour accéder à l'index d'un vectoriel 2D, comme ci-dessous?
vector<vector<double>> weight;
void Connection::setWeight(const double& value, const double& i, const double& j)
{
//The other scheme except: weight[i][j] = value;
}
weight.at(i).at(j) = value;
+1 - je ne vois pas pourquoi cette question mérite un downvote.
car il est aisé de le deviner en regardant une partie de la documentation?
Peut-être que vous ne me croyez pas, mais je pose cette question ici, après un certain temps à parcourir le web pour trouver plus d'une dimension... Mais je vous remercie pour vos éclaircissements sur le potentiel des capacités de la documentation!!!
Les vecteurs n'ont jamais plus d'une dimension. Vous devez penser en termes de "chaînes" de garde", vous recevez l'intérieur de vecteur à partir de l'extérieur vecteur puis effectuer une nouvelle opération sur l'intérieure de vecteur.
OriginalL'auteur Roboticist | 2014-09-01
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
at
deux fois. A noter également, sii
etj
sont des indices, ils ont vraiment ne devrait pas êtredouble
.size_t
est en faitunsigned int
, puisque vous ne pouvez pas utiliser un indice négatif.OriginalL'auteur CoryKramer
Risquer d'être downvoted pour l'optimisation prématurée, et parce qu'il n'a pas vraiment de réponses à la question posée, je tiens à rappeler à propos d'un problème grave dans une telle approche.
Comme n'importe quel tableau multidimensionnel, vecteur de vecteur n'est pas contiguë, ce qui rend ses caractéristiques de performance terriblement mauvais à cause de manque de spatiale de la localité et associés le cache.
Vous pouvez trivialement résoudre le problème en l'enveloppant d'un seul tableau multidimensionnel avec une interface de tableau à deux dimensions.
Notez que le code ci-dessus écrit à la volée et n'a pas été compilé. Pourtant, je crois que vous avez eu l'idée.
Voir aussi:
Vous avez affirmé que la performance dans ce cas est terrible... Alors, quelle est votre suggestion pour une structure de données efficace pour l'algèbre linéaire et de manipulation de matrice?! Pourriez-vous expliquer pourquoi votre extrait de code peut-être mieux que vecteurs 2D, en vue de l'exécution?
Eh bien, c' "terrible de la performance" est en fait une mauvaise et le professionnalisme façon de décrire mon subjective de la compréhension de la façon dont les tableaux multidimensionnels travail. Sûrement, vous avez besoin de profil et de penser dans un contexte de votre application. Peut-être vecteur de vecteurs fonctionnent très bien pour vous et que vous n'avez pas besoin d'introduire une complexité supplémentaire dans votre code. Mais, en tant que point de départ, je vous conseille d'essayer de faire une telle coutume wrapper pour
std:vector
et de comparer son rendement à l'approche originale. Aussi, me trouve personnellement qu'il est utile dans de nombreuses applications, de tetris grille 😉 mathématiques complexes apps.De cache du PROCESSEUR est très important de nos jours de sorte que nous ne devons pas jeter toute possibilité d'abus (avec le multithreading, la vectorisation et la direction de la prévision). Il y a de très bonnes explications si vous suivez le "Voir aussi" des liens, de sorte que je ne voudrais pas répéter. (Et je ne suis probablement pas en mesure d'expliquer mieux)
pour le jeu et les ressources :D, même si j'ai toujours ne peux pas penser à autre approche pour mon cas!...
OriginalL'auteur Ivan Aksamentov - Drop