À l'aide de la pile de la standard template library
Je viens de coder un petit programme permettant de transférer un personnage d'une chaîne sur la pile et de l'imprimer en haut de la valeur.
Ils sont de simples codes, mais avec un concept différent,je voudrais demander à qui un des le code est le plus efficace et pourquoi?
1er code
#include<string>
#include<iostream>
#include<stack>
using namespace std;
int main(){
string str ;
stack<char> s;
cin >> str ;
for(int i=0;i<str.size();i++){
cout << str[i] << "\n";
s.push(str[i]);
cout << "Top of the stack " << s.top() << endl;}
cout << "\n" << endl;
return 0;}
2ème code à l'Aide d'un Itérateur
#include<string>
#include<iostream>
#include<stack>
using namespace std;
int main(){
string str ;
stack<char> s;
cin >> str ;
for(string::iterator itr = str.begin();itr!=str.end();itr++){
cout << *itr << "\n";
s.push(*itr);
cout << "Top of the stack " << s.top() << endl;}
cout << "\n" << endl;
return 0;}
Ils sont tout simplement les deux codes, je veux juste savoir qui est le plus efficace ??
- Vous ne remarquerez aucune différence entre les deux méthodes depuis
cout
va prendre beaucoup plus de temps que d'extraire lechar
s à partir de la chaîne.
Vous devez vous connecter pour publier un commentaire.
Si l'on définit l'efficacité en terme de nombre d'opérations de base des méthodes de le faire, je crois qu'il n'y a pas de différence entre ces deux méthodes. Comme vous le savez, la mise en œuvre de la
std::string
est basé sur le simple tableau de caractères (commestd::vector
) ce qui signifie que les caractères sont stockés de façon continue morceau de la mémoire. Cela permet d'accéder à tout élément dans une plage valide dans un nombre constant d'opérations (O(1)). De sorte que la récupération de la ième caractèrestr[i]
nécessite O(1) opérations comme un accès à une entrée du tableau. De même, dans la deuxième méthode, vous utiliser des itérateurs, qui sont, grosso modo, les pointeurs, à l'emplacement du tableau dans ce contexte. Afin d'accéder à leur contenu*itr
et de progresser d'une positionitr++
est de la même efficacité que de déplacer le curseur le long de la tableau et récupérer son contenu.Donc encore une fois, l'idée clé est que les caractères dans
std::string
sont stockés dans le tableau continu, ce qui lui donne de telles capacités. Vous pouvez comparer sa mise en œuvre avecstd::map
où l'implémentation sous-jacente est d'un rouge-noir arbre, qui, bien sûr, n'est pas un tableau. Et donc, la[]
opérateur travaille en temps logarithmique (à l'inverse de la constante dansstd::string
).EDIT:
Comme il a été mentionné dans le commentaire,
cout
de sortie est relativement coûteux (mais toujours O(1)). Donc, si vous voulez vérifier "réel", plus d'efficacité, vous devez supprimer la sortie ou appelezstd::ios_base::sync_with_stdio(false);
lorsque les programmes d'commence afin d'augmenter la vitesse decout
.