C++中如何迭代LPVOID转换后的std::list容器?
解决std::list指针的遍历问题
你的代码出现错误主要有两个核心问题:迭代器的类型声明错误,以及对指针类型list的成员访问方式错误。下面我会帮你修正并解释原因:
错误分析
- 迭代器类型声明错误:你把迭代器声明成了指针类型(
std::list<...>::iterator * it),但std::list的迭代器本身是一个对象(并非原生指针),不需要额外加*来声明指针类型的迭代器。 - 指针成员访问错误:
ptrList是指向std::list的指针,你需要用->运算符调用它的成员函数(begin()、end()),而不是.。*ptrList.begin()的写法优先级有问题,.的优先级高于*,会先尝试调用指针ptrList的begin()成员,这显然不符合逻辑(指针本身没有begin()方法)。
正确的遍历代码
传统迭代器方式
#include <list> #include <utility> // 用于std::pair // 假设functionToGetList()是你调用的API函数 LPVOID functionToGetList(); int main() { std::list<std::pair<INT16, INT32>>* ptrList = reinterpret_cast<std::list<std::pair<INT16, INT32>>*>(functionToGetList()); // 正确的迭代器遍历 for (std::list<std::pair<INT16, INT32>>::iterator it = ptrList->begin(); it != ptrList->end(); ++it) { // 访问pair中的两个元素 INT16 firstValue = it->first; INT32 secondValue = it->second; // 在这里添加你的业务逻辑,比如打印值 // printf("First: %d, Second: %d\n", firstValue, secondValue); } return 0; }
C++11及以上推荐:范围for循环
如果你的编译器支持C++11或更高版本,范围for循环会让代码更简洁易读:
#include <list> #include <utility> LPVOID functionToGetList(); int main() { std::list<std::pair<INT16, INT32>>* ptrList = reinterpret_cast<std::list<std::pair<INT16, INT32>>*>(functionToGetList()); // 范围for循环遍历 for (const auto& elem : *ptrList) { INT16 firstValue = elem.first; INT32 secondValue = elem.second; // 处理你的逻辑 } return 0; }
额外提示
- 建议用
reinterpret_cast来进行指针类型转换,这是C++中用于不同指针类型转换的标准方式,比C风格的强制转换更清晰。 - 确保API返回的
LPVOID确实指向一个合法的std::list<std::pair<INT16, INT32>>对象,否则会导致未定义行为。
内容的提问来源于stack exchange,提问作者Marcus Stelzer
相关产品推荐
相关产品推荐

