Maison >développement back-end >C++ >Utilisations abusives courantes et solutions des bibliothèques de conteneurs C++
Les erreurs courantes lors d'une mauvaise utilisation des bibliothèques de conteneurs incluent la non-utilisation d'un conteneur de taille fixe (1), l'utilisation d'un itérateur hors de portée (2), l'utilisation du mauvais type de conteneur (3), la confusion des adaptateurs de conteneur avec le conteneur sous-jacent (4) et violations de propriété Règle (5). Les solutions incluent l'utilisation d'adaptateurs de liste ou de conteneur, la vérification de la validité des itérateurs ou l'utilisation de boucles basées sur des plages, la mise en correspondance des types de conteneurs et de leurs itérateurs, l'accès correct au conteneur sous-jacent via l'adaptateur de conteneur et le respect des règles de propriété de la bibliothèque de conteneurs.
Utilisations abusives et solutions courantes des bibliothèques de conteneurs C++
Les bibliothèques de conteneurs sont une partie importante de la bibliothèque standard C++ et sont largement utilisées pour stocker et manipuler des structures de données. Cependant, les débutants abusent souvent de ces conteneurs, ce qui entraîne des erreurs difficiles à trouver.
1. La surcharge de mémoire n'est pas prise en compte
// 错误:预先分配了比所需更多的空间 vector<int> v(1000000);
Solution : À utiliser uniquement si un conteneur de taille fixe est requis, sinon utilisez une liste ou un adaptateur de conteneur.
// 正确:根据需要增长 list<int> v;
2. Utilisation inappropriée des itérateurs
// 错误:在范围外访问 for (auto it = v.begin(); it != v.end(); ++it) { *it += 1; if (it == v.end()) { // 迭代器已无效 break; } }
Solution : Vérifiez toujours la validité des itérateurs ou utilisez une boucle for basée sur une plage.
// 正确:基于范围的 for 循环 for (int& x : v) { x += 1; }
3. Utiliser le « mauvais » type de conteneur
// 错误:对无序容器使用有序迭代器 set<int> s; for (auto it = s.begin(); it != s.end(); ++it) { // 有序迭代器 *it += 1; }
Solution : Faites correspondre le type de conteneur et son type d'itérateur.
// 正确:无序迭代器 for (auto it = s.begin(), ie = s.end(); it != ie; ++it) { *it += 1; }
4. Confondre les adaptateurs de conteneur et les conteneurs de base
// 错误:将容器适配器与基础容器混合使用 map<int, vector<int>> m; m[0].push_back(1); m.find(0)->second.push_back(2); // 错误,返回容器适配器
Solution : Utilisez la syntaxe correcte lors de l'accès aux conteneurs de base via les adaptateurs de conteneur.
// 正确:通过容器适配器访问基础容器 m.find(0)->second.emplace_back(2);
5. Violation des règles de propriété
// 错误:指针指向已销毁的容器中的元素 { vector<int> v; int* ptr = &v[0]; v.pop_back(); // ptr 指向已销毁的元素 }
Solution : Suivez les règles de propriété de la bibliothèque conteneur et assurez-vous que le pointeur pointe vers un élément valide.
// 正确:使用智能指针或引用 std::shared_ptr<int> ptr = &v[0];
Cas pratique :
Écrire un programme pour lire un ensemble de mots dans un fichier et compter leurs occurrences. Utilisez une carte non ordonnée pour stocker les mots et leur nombre.
#include <iostream> #include <string> #include <unordered_map> using namespace std; int main() { // 读取单词并计数出现次数 unordered_map<string, int> word_counts; for (string line; getline(cin, line); ) { for (string word : line | views::split(" ")) { // C++20 范围-视图 word_counts[word]++; } } // 打印出现次数最多的 10 个单词 for (auto [word, count] : word_counts | views::take(10) | views::reverse) { cout << word << ": " << count << '\n'; } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!