web-dev-qa-db-fra.com

Modifier les éléments du vecteur (par valeur, par référence) Fonction C ++

J'ai une fonction où je dois modifier les valeurs d'un vecteur. est-ce une bonne pratique en C++ de renvoyer le vecteur?

Fonction 1:

vector<string> RemoveSpecialCharacters(vector<string> words)
{
    for (vector<string>::iterator it=words.begin(); it!=words.end(); )
    {
        if(CheckLength(*it) == false)
        {
            it = words.erase(it);
        }
        else{
            ++it;
        }
    }//end for

    return words;
}

Fonction 2:

void RemoveSpecialCharacters(vector<string> & words)
{
    for (vector<string>::iterator it=words.begin(); it!=words.end(); )
    {
        if(CheckLength(*it) == false)
        {
            it = words.erase(it);
        }
        else{
            ++it;
        }
    }//end for
}
15
Hani Goc

Vos deux fonctions servent à deux fins différentes.

  • Fonction 1: fonctionne comme remove_copy. Cela pas modifiera le conteneur existant; il en fait une copie et la modifie à la place.

  • Fonction 2: fonctionne comme remove. Il modifiera le conteneur existant.

6
billz

C'est un peu subjectif. Personnellement, je préférerais ce dernier, car il n'impose pas le coût de la copie du vecteur à l'appelant (mais l'appelant est toujours libre de faire la copie s'il le souhaite).

3
NPE

Dans ce cas particulier, je choisirais de passer par référence, mais pas parce que c'est une pratique C++ ou non, mais parce que cela a plus de sens (la fonction par son nom applique une modification au vecteur). Il ne semble pas y avoir besoin pour renvoyer les données de la fonction.

Mais cela dépend aussi du but de la fonction. Si vous toujours souhaitez l'utiliser de la manière suivante:

vec = bow.RemoveSpecialCharacters(vec);

Alors absolument la première option est un go. Sinon, le second semble plus approprié. (A en juger par le nom de la fonction, la première semble pour moi être plus appropriée).

En termes de performances, la première solution dans le monde C++ 11 moderne sera plus ou moins ralentie, donc l'impact sur les performances serait négligeable.

2
Spook

Optez pour option 2, en modifiant le vecteur passé en paramètre.

Note latérale : certaines pratiques de codage suggèrent de passer par des pointeurs des arguments qui peuvent être modifiés (juste pour faire comprendre au premier coup d'œil aux développeurs que la fonction peut changer l'argument).

1
Claudio

La meilleure pratique consiste à passer par référence le vecteur.

À l'intérieur de la fonction, vous l'éditez et vous n'avez pas à la renvoyer (ce qui en fait vous allouez un nouvel espace mémoire qui n'est pas nécessaire).

Si vous le passez par référence, le coût est beaucoup plus petit et le vecteur est également édité hors de la portée de la fonction

1
EoD

La première fonction renverra une copie du vecteur, elle sera donc plus lente que la seconde. Vous devez utiliser le second.

En fait, ni l'un ni l'autre n'est une bonne pratique pour C++, si par bonne pratique cela signifie comment cela se fait dans les bibliothèques C++. Vous réimplémentez essentiellement ce que std::remove_copy_if ou std::remove_if le fait, donc la bonne pratique est d'implémenter des fonctions (ou d'utiliser celles existantes), qui fonctionnent sur la plage, pas sur le conteneur, soit par valeur, soit par référence.

Encore une fois, cela dépend de la façon dont vous définissez le terme good practice.

0
Slava