誤用容器庫時,常見錯誤包括未使用固定大小容器(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];
實戰案例:
寫一個程序,從檔案中讀取一組單字併計數它們的出現次數。使用無序映射來儲存單字和它們的計數。
#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'; } }
以上是C++ 容器庫的常見誤用和解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!