コンテナ ライブラリを誤用するときによくある間違いには、固定サイズのコンテナを使用しない (1)、範囲外のイテレータを使用する (2)、間違ったコンテナ タイプを使用する (3)、コンテナ アダプタと基礎となるコンテナを混同する (4)、所有権が含まれる規則 (5) の違反。解決策には、リストまたはコンテナ アダプタの使用、イテレータの有効性の確認または範囲ベースのループの使用、コンテナの種類とそのイテレータの一致、コンテナ アダプタを介して基礎となるコンテナに正しくアクセスすること、コンテナ ライブラリの所有権ルールに従うことが含まれます。
C++ コンテナ ライブラリの一般的な誤用と解決策
コンテナ ライブラリは C++ 標準ライブラリの重要な部分であり、データ構造の保存と操作に広く使用されています。ただし、初心者はこれらのコンテナを誤用することが多く、その結果、見つけにくいエラーが発生します。
1. メモリのオーバーヘッドは考慮されません
// 错误:预先分配了比所需更多的空间 vector<int> v(1000000);
解決策: 固定サイズのコンテナが必要な場合にのみ使用し、それ以外の場合はリストまたはコンテナ アダプタを使用します。
// 正确:根据需要增长 list<int> v;
2. イテレータの不適切な使用
// 错误:在范围外访问 for (auto it = v.begin(); it != v.end(); ++it) { *it += 1; if (it == v.end()) { // 迭代器已无效 break; } }
解決策: イテレータの有効性を常にチェックするか、範囲ベースの for ループを使用します。
// 正确:基于范围的 for 循环 for (int& x : v) { x += 1; }
3. 「間違った」コンテナタイプの使用
// 错误:对无序容器使用有序迭代器 set<int> s; for (auto it = s.begin(); it != s.end(); ++it) { // 有序迭代器 *it += 1; }
解決策: コンテナタイプとそのイテレータタイプを一致させます。
// 正确:无序迭代器 for (auto it = s.begin(), ie = s.end(); it != ie; ++it) { *it += 1; }
4. コンテナアダプターとベースコンテナの混同
// 错误:将容器适配器与基础容器混合使用 map<int, vector<int>> m; m[0].push_back(1); m.find(0)->second.push_back(2); // 错误,返回容器适配器
解決策: コンテナアダプターを介してベースコンテナにアクセスするときは、正しい構文を使用してください。
// 正确:通过容器适配器访问基础容器 m.find(0)->second.emplace_back(2);
5. 所有権ルールの違反
// 错误:指针指向已销毁的容器中的元素 { vector<int> v; int* ptr = &v[0]; v.pop_back(); // ptr 指向已销毁的元素 }
解決策: コンテナライブラリの所有権ルールに従い、ポインタが有効な要素を指していることを確認してください。
// 正确:使用智能指针或引用 std::shared_ptr<int> ptr = &v[0];
実際のケース:
ファイルから一連の単語を読み取り、その出現を数えるプログラムを作成します。順序なしマップを使用して、単語とその数を保存します。
りー以上がC++ コンテナ ライブラリの一般的な誤用と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。