Heim >Backend-Entwicklung >C++ >Häufige Missbräuche und Lösungen von C++-Containerbibliotheken

Häufige Missbräuche und Lösungen von C++-Containerbibliotheken

WBOY
WBOYOriginal
2024-06-02 11:48:57550Durchsuche

Häufige Fehler bei der missbräuchlichen Verwendung von Containerbibliotheken sind die Nichtverwendung eines Containers mit fester Größe (1), die Verwendung eines Iterators außerhalb des Gültigkeitsbereichs (2), die Verwendung des falschen Containertyps (3), die Verwechslung von Containeradaptern mit dem zugrunde liegenden Container (4) und Eigentumsverstöße Regel (5). Zu den Lösungen gehören die Verwendung von Listen- oder Containeradaptern, die Überprüfung der Iteratorgültigkeit oder die Verwendung bereichsbasierter Schleifen, der Abgleich von Containertypen und ihren Iteratoren, der korrekte Zugriff auf den zugrunde liegenden Container über den Containeradapter und die Einhaltung der Eigentumsregeln der Containerbibliothek.

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

Häufige Fehlanwendungen und Lösungen von C++-Containerbibliotheken

Containerbibliotheken sind ein wichtiger Bestandteil der C++-Standardbibliothek und werden häufig zum Speichern und Bearbeiten von Datenstrukturen verwendet. Allerdings verwenden Anfänger diese Behälter häufig falsch, was zu schwer zu findenden Fehlern führt.

1. Der Speicheraufwand wird nicht berücksichtigt

// 错误:预先分配了比所需更多的空间
vector<int> v(1000000);

Lösung: Nur verwenden, wenn ein Container mit fester Größe erforderlich ist, andernfalls Liste oder Containeradapter verwenden.

// 正确:根据需要增长
list<int> v;

2. Unsachgemäße Verwendung von Iteratoren

// 错误:在范围外访问
for (auto it = v.begin(); it != v.end(); ++it) {
  *it += 1;
  if (it == v.end()) {  // 迭代器已无效
    break;
  }
}

Lösung: Überprüfen Sie immer die Gültigkeit von Iteratoren oder verwenden Sie eine bereichsbasierte for-Schleife.

// 正确:基于范围的 for 循环
for (int& x : v) {
  x += 1;
}

3. Verwendung des „falschen“ Containertyps

// 错误:对无序容器使用有序迭代器
set<int> s;
for (auto it = s.begin(); it != s.end(); ++it) {  // 有序迭代器
  *it += 1;
}

Lösung: Passen Sie den Containertyp und seinen Iteratortyp an.

// 正确:无序迭代器
for (auto it = s.begin(), ie = s.end(); it != ie; ++it) {
  *it += 1;
}

4. Verwirrende Containeradapter und Basiscontainer

// 错误:将容器适配器与基础容器混合使用
map<int, vector<int>> m;
m[0].push_back(1);
m.find(0)->second.push_back(2);  // 错误,返回容器适配器

Lösung: Verwenden Sie die richtige Syntax, wenn Sie über Containeradapter auf Basiscontainer zugreifen.

// 正确:通过容器适配器访问基础容器
m.find(0)->second.emplace_back(2);

5. Verletzung der Eigentumsregeln

// 错误:指针指向已销毁的容器中的元素
{
  vector<int> v;
  int* ptr = &v[0];
  v.pop_back();  // ptr 指向已销毁的元素
}

Lösung: Befolgen Sie die Eigentumsregeln der Containerbibliothek und stellen Sie sicher, dass der Zeiger auf ein gültiges Element zeigt.

// 正确:使用智能指针或引用
std::shared_ptr<int> ptr = &v[0];

Praktischer Fall:

Schreiben Sie ein Programm, um eine Reihe von Wörtern aus einer Datei zu lesen und deren Vorkommen zu zählen. Verwenden Sie eine ungeordnete Karte, um Wörter und ihre Anzahl zu speichern.

#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';
  }
}

Das obige ist der detaillierte Inhalt vonHäufige Missbräuche und Lösungen von C++-Containerbibliotheken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn