首頁  >  文章  >  後端開發  >  C++ 容器庫的常見誤用和解決方案

C++ 容器庫的常見誤用和解決方案

WBOY
WBOY原創
2024-06-02 11:48:57521瀏覽

誤用容器庫時,常見錯誤包括未使用固定大小容器(1)、使用迭代器超出範圍(2)、使用錯誤的容器類型(3)、混淆容器適配器和基礎容器(4)、以及違反所有權規則(5)。解決方案包括使用清單或容器適配器、檢查迭代器有效性或使用基於範圍的循環、匹配容器類型及其迭代器、透過容器適配器正確存取基礎容器以及遵循容器庫的所有權規則。

C++ 容器库的常见误用和解决方案

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn