C++传入vector指针作参数时访问元素报错问题求解
错误原因
你传入的参数L是std::vector<int>*类型的指针,直接写L[i]时,编译器会将其解析为「从指针L的起始地址向后偏移i个std::vector<int>长度的位置,取该位置的vector对象」,并不是访问传入的那个vector内部的第i个元素,自然会触发类型不匹配的报错。
除此之外你的代码还存在3处逻辑错误:
- 外层循环条件写反:
while(isSorted(*L))是列表已经有序时才进入循环,完全不符合冒泡排序的执行逻辑 - 元素比较逻辑错误:
if(i<L[i])是拿下标i和元素值比,冒泡排序需要比较相邻两个元素的大小决定是否交换 - 缺少下标
i的自增逻辑,原有写法会导致i无法正常遍历,直接进入死循环
修复方案
- 指针访问vector元素时,必须先对指针解引用拿到vector实例,再使用下标访问,写法为
(*L)[下标],外层括号不能省略(下标运算符优先级高于解引用运算符,不加括号会被解析为*(L[下标]),还是错误写法) - 补全冒泡排序的正常逻辑:增加有序标记、修正循环条件、修正相邻元素比较规则、补全下标遍历逻辑、处理空指针边界情况
修复后代码
保留传指针写法的可运行版本:
void bubbleSort(std::vector<int> *L) { // 空指针直接返回,避免崩溃 if (!L) return; int temp; bool isSorted = false; while (!isSorted) { isSorted = true; // 遍历到倒数第二个元素即可,要预留i+1的位置 for (unsigned int i = 0; i < L->size() - 1; ++i) { // 相邻元素逆序则交换 if ((*L)[i] > (*L)[i+1]) { temp = (*L)[i+1]; (*L)[i+1] = (*L)[i]; (*L)[i] = temp; isSorted = false; // 发生交换说明还没排好序 } } } }
更推荐的写法是直接传vector的引用,从根源上避免指针解引用的错误,代码也更简洁:
void bubbleSort(std::vector<int>& L) { int temp; bool isSorted = false; while (!isSorted) { isSorted = true; for (unsigned int i = 0; i < L.size() - 1; ++i) { if (L[i] > L[i+1]) { temp = L[i+1]; L[i+1] = L[i]; L[i] = temp; isSorted = false; } } } }
内容的提问来源于stack exchange,提问作者josh denson
相关产品推荐
相关产品推荐

