当前位置: 首页 > wzjs >正文

永州建设网站制作建设英文网站费用

永州建设网站制作,建设英文网站费用,主流软件开发平台,福州自助建站软件目录 1.hash 去重 一、使用STL的unordered_set快速去重(推荐) 二、自定义哈希表实现去重(链地址法) 三、典型应用场景 四、性能对比 2. 对比 find | count find() count() 3. 字符串逐个字符插入v…

目录

1.hash 去重

一、使用STL的unordered_set快速去重(推荐)

二、自定义哈希表实现去重(链地址法)

三、典型应用场景

四、性能对比

2. 对比 find | count

find()

count()

3. 字符串逐个字符插入vector

4. 栈溢出 (heap-buffer-overflow)

错误根源

🛠️ 分场景修复方案

场景1:数组/vector索引越界(高频原因)

场景2:动态内存分配不足

场景3:指针野指针问题

调试技巧

总结


1.hash 去重

在C++中,哈希表常用于高效去重场景。下面将介绍 两种典型的实现方式及代码示例:

一、使用STL的unordered_set快速去重(推荐)
#include <iostream>
#include <unordered_set>
#include <vector>void deduplicate_with_unordered_set() {std::vector<int> input = {2, 5, 2, 8, 5, 6, 8, 8};std::unordered_set<int> hash_set;// 去重逻辑for (int num : input) {if (hash_set.find(num) == hash_set.end()) {  // O(1)时间复杂度查询hash_set.insert(num);//没发现 就插入}}// 输出结果std::cout << "去重后的元素:";for (int unique_num : hash_set) {std::cout << unique_num << " ";}
}

特点 [2] [6]:

  • 基于STL实现,无需手动处理哈希冲突
  • 平均时间复杂度为O(n)
  • 适用于基础类型和可哈希对象

二、自定义哈希表实现去重(链地址法)
#include <iostream>
#include <list>
#define TABLE_SIZE 10class HashTable {
private:std::list<int> table[TABLE_SIZE];int hashFunction(int key) {return key % TABLE_SIZE;  // 简单取模哈希函数}public:void insert(int key) {int index = hashFunction(key);for (auto it = table[index].begin(); it != table[index].end(); ++it) {if (*it == key) return;  // 发现重复则直接返回}table[index].push_back(key);  // 无重复时插入}void printUnique() {std::cout << "去重后的元素:";for (int i=0; i<TABLE_SIZE; ++i) {for (int num : table[i]) {std::cout << num << " ";}}}
};int main() {HashTable ht;int arr[] = {2, 5, 2, 8, 5, 6, 8, 8};for (int num : arr) {ht.insert(num);}ht.printUnique();return 0;
}

实现原理 [1] [3]:

  1. 通过hashFunction计算桶位置
  2. 在链表桶中遍历查找重复元素
  3. 无重复时插入新元素
  4. 冲突处理采用链地址法

三、典型应用场景
  1. 日志去重
    处理海量日志时,用哈希表记录已处理日志的指纹(如MD5值),避免重复分析 [4]。
  2. 数据库索引优化
    在ETL过程中对主键进行预去重,例如:
std::unordered_set<std::string> unique_keys;
while (auto record = db.fetch()) {if (!unique_keys.count(record.id)) {process(record);unique_keys.insert(record.id);}
}

  1. 网络爬虫URL管理
    存储已爬取URL的哈希值,防止重复抓取:
std::unordered_set<size_t> visited_urls;
size_t url_hash = std::hash<std::string>{}(url);
if (!visited_urls.count(url_hash)) {crawl(url);visited_urls.insert(url_hash);
}

四、性能对比

实现方式

平均时间复杂度

空间复杂度

适用场景

STL unordered_set

O(n)

O(n)

通用场景

自定义链式哈希表

O(n)

O(n+m)

需要控制底层实现时

线性探查法

O(n)~O(n²)

O(n)

内存受限环境 [6]


2. 对比 find | count

find()

  1. 功能
    返回指向目标元素的迭代器,若未找到则返回end()迭代器。
auto it = hash.find(42);
if (it != hash.end()) {cout << "找到元素:" << *it;
}

count()

返回 hash[num] 的 value


3. 字符串逐个字符插入vector

(适用于滑动窗口算法场景):

class Solution {
public:int lengthOfLongestSubstring(string s) {vector<char> str;// 直接遍历字符串的每个字符(无需拆分)for (char c : s) {  // 范围for循环 [9]str.push_back(c);}// 或使用迭代器 [6]// for (auto it = s.begin(); it != s.end(); ++it) {//     str.push_back(*it);// }// 后续滑动窗口算法逻辑...}
};

关键要点:

  1. 字符串本身可视为字符数组,直接遍历即可
  2. 使用范围for循环(C++11特性)最简洁
  3. 若需要处理子串分割(如按空格分割),可参考istringstream方法

4. 栈溢出 (heap-buffer-overflow)

错误根源

报错表明在 solution.cpp:11:18 处尝试读取非法堆内存地址 0x503000000150越界情况,具体原因可能为:

  1. 数组/vector越界访问:例如 vector<int> nums 的索引超出 [0, nums.size()-1] 范围
  2. 动态内存分配不足mallocnew 分配的空间不足以容纳后续操作(如 int* arr = malloc(10) 但访问 arr[10]
  3. 指针偏移错误:指针算术运算后指向非法地址(如 ptr += offset 越界)([2] 。
  4. 对象生命周期问题:已释放内存被重复访问(如 free(x) 后仍使用 x[0])。

🛠️ 分场景修复方案

场景1:数组/vector索引越界(高频原因)

假设代码涉及滑动窗口算法(minSubArrayLen 函数常见于此类问题):

// 错误示例:right 可能达到 nums.size()
int left = 0, right = 0;
while (right <= nums.size()) {  // ❌ 当 right=nums.size() 时 nums[right] 越界sum += nums[right];right++;
}// 修复:调整循环条件
while (right < nums.size()) {  // ✅ 确保 right ∈ [0, nums.size()-1]sum += nums[right];right++;
}

验证方法:在循环内添加 cout << "right=" << right << endl; 观察索引值

场景2:动态内存分配不足

若涉及手动内存分配:

// 错误示例:分配空间不足(网页4案例)
int* arr = (int*)malloc(sizeof(int) * 5);
for (int i=0; i<=5; i++) {  // ❌ i=5 越界访问arr[i] = i;  
}// 修复:调整分配大小或循环范围
int* arr = (int*)malloc(sizeof(int) * 6);  // ✅ 分配6个元素空间
for (int i=0; i<6; i++) {arr[i] = i;
}

验证方法:检查 malloc/new 的参数是否与后续操作匹配

场景3:指针野指针问题

若存在指针传递或赋值逻辑(类似网页9案例):

char* parray = (char*)malloc(100);
char* array = parray;
free(parray);
// 错误:后续使用 array 指针会访问已释放内存// 修复:释放后置空指针
free(parray);
parray = nullptr;  // ✅ 避免野指针
array = nullptr;

调试技巧

  1. AddressSanitizer日志分析
    关注错误日志中的 Shadow bytes 部分,通过内存映射关系定位越界位置:
Shadow bytes around the buggy address: 
0x0c187fff80c0: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
    • fa:可寻址内存区域
    • fd:已分配内存的 RedZone
      非法访问会显示在 RedZone 边界外。
  1. 最小化复现代码
    minSubArrayLen 函数剥离为独立测试用例,逐步注释代码块定位具体越界操作。

总结

针对 solution.cpp:11:18READ 操作,优先检查以下位置:

  1. vector访问:确认 vector<int>& nums 的所有 [].at() 操作索引合法性。
  2. 迭代器失效:若使用 auto it = nums.begin(),检查循环中是否触发迭代器失效(如插入/删除操作)。
  3. 内存复用:检查是否复用已释放的临时变量内存空间(如函数返回局部变量指针)。
http://www.dtcms.com/wzjs/567529.html

相关文章:

  • 网站的优化和推广方案怎么写做电影网站还能赚钱
  • 贵阳市花溪区建设局网站百度搜索
  • 安徽省建设工程造价管理总站网站网站开发过程分为哪几个阶段
  • 学做网站论坛教学视频下载深圳福田地图
  • 大理网站推广百度网页首页
  • 山东官网建设公司中小型企业网站优化价格
  • 以绿色为主色的网站模版咨询公司怎么注册
  • 榆林做网站多少钱北京网站策划公司
  • 运城姚孟网站建设广西城市建设学校手机官方网站
  • 动漫网站建站目的商城设计app网站建设
  • 设计网站专题页包括那些项目旅游网站模板
  • 小型网站开发费用肇庆网络推广公司
  • 网站怎么做微信扫描登录网站官方网站下载微信最新版
  • 东莞易进网络专业网站建设 网站寻花问柳专注做一家男人最爱的网站
  • 湖北住房与城乡建设厅网站流放之路做装备词缀网站
  • 购物商城平台有哪些佛山优化网站方法
  • 网站开发设计前景洛阳网站建设设计公司
  • 广东建设执业网站上海好的网站设计公司有哪些
  • 建筑规范网站wordpress 菜单 下拉菜单
  • php企业门户网站wordpress 上传时发生了错误
  • 用 asp net 做 的网站建设工程类招标信息发布网站
  • 在哪里可以改动网站标题商城网站要多少钱
  • 网站免费虚拟主机申请泰兴网站开发
  • 深圳福田区区住房和建设局网站wordpress链接
  • 临淄关键词网站优化哪家好中企动力z邮箱登录入口
  • 学校网站建设说明海口网站建设
  • 商标注册查询官方网站展厅设计参考图
  • 平面设计公司简介seo作用与原理思维导图
  • 深圳网站公司好门户网站 需求
  • 贵阳网站建设培训班深圳福田区房价2022最新房价