C++老手都可能搞错:std::vector<std::vector<int>>的致命性能陷阱

1. 引言

C++标准库为开发者提供了一个异常强大的“军火库”——标准容器(Standard Containers)。从提供动态数组功能的 std::vector,到双向链表 std::list,再到基于红黑树的有序关联容器 std::mapstd::set,以及哈希实现的 std::unordered_map,它们各自拥有独特的内存布局、性能特征和适用场景。这种多样性正是C++强大表达能力的基石。

然而,在复杂的真实世界工程问题中,单一类型的容器往往不足以优雅地构建数据模型。我们常常需要将这些基础模块以各种方式“组合”起来,以应对更复杂的数据结构需求。本文旨在深入探讨C++中组合与操作不同容器的三种核心模式:

  1. 容器嵌套 (Nested Containers):将一个容器作为另一个容器的元素类型,用以构建多维或层级化的数据结构。
  2. 异构存储 (Heterogeneous Storage):在同一个容器中存储不同类型的对象,打破C++容器的同质性(Homogeneous)限制。
  3. 元素迁移 (Element Transfer):在不同容器间高效地移动或合并元素,优化数据流转。

2. 模式一:容器嵌套(Nested Containers)

容器嵌套是最直观、最常用的容器组合方

#include <iostream> #include <map> using namespace std; map<string, string> english_chinese = {{"white", "白色"}, {"black", "黑色"}}; map<string, string> chinese_english = {{"白色", "white"}, {"黑色", "black"}}; /*还可以使用今天学过的迭代器进行初始化 vector<pair<string, string>> word_pairs = { {"white", "白色"}, {"black", "黑色"} }; // 初始化 english_chinese(使用迭代器) map<string, string> english_chinese; for (auto it = word_pairs.begin(); it != word_pairs.end(); ++it) { english_chinese[it->first] = it->second; } // 初始化 chinese_english(使用迭代器) map<string, string> chinese_english; for (auto it = word_pairs.begin(); it != word_pairs.end(); ++it) { chinese_english[it->second] = it->first; } */ bool IncludeChinese(char* str) { char c; while (1) { c = *str++; if (c == 0) break; if (c & 0x80) if (*str & 0x80) return true; } return false; } string translate(const string& word) { // 需要将const string转换为char*以匹配原函数参数类型 char* str = const_cast<char*>(word.c_str()); if (IncludeChinese(str)) { auto it = chinese_english.find(word); if (it != chinese_english.end()) { return it->second; } } else { auto it = english_chinese.find(word); if (it != english_chinese.end()) { return it->second; } } return "未找到该词的翻译"; } int main() { string word; cout << "请输入需要查询的词汇: "; while (cin >> word) { string result = translate(word); cout << "翻译结果: " << result << endl; cout << "请输入需要查询的词汇: "; } return 0; }代码问题
最新发布
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讳疾忌医丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值