C++ vector元素计算、索引获取及类成员函数调用报错问题求助
问题1:调用computeAveragePrice报错
- 根本原因:
computeAveragePrice是OrderBookEntry类的非静态成员函数,不属于std::vector类,直接用vector实例entries调用该函数,编译器找不到对应方法,必然报错。 - 修复方案:
- 将
computeAveragePrice改为OrderBookEntry的静态成员函数,因为该函数的作用是处理整个entry集合,不需要绑定到单个OrderBookEntry实例,在类内函数声明前加static修饰即可:static double computeAveragePrice(std::vector<OrderBookEntry>& entries); - 调用时改为通过类名调用,传入entries作为参数:
std::cout << "The average price is " << OrderBookEntry::computeAveragePrice(entries) << std::endl;
- 将
问题2:打印vector元素索引异常
- 根本原因:范围for循环只能直接拿到元素本身,你打印的
&entry是元素在内存中的虚拟地址,不是元素在vector里的下标索引,自然不符合预期。 - 修复方案:
可以自己维护一个索引计数器,或者使用传统下标遍历:// 方法1:范围for+自定义计数器 size_t idx = 0; for (OrderBookEntry& entry : entries) { std::cout << "The price of entry " << idx << " is " << entry.price << std::endl; idx++; } // 方法2:传统下标遍历 for (size_t i = 0; i < entries.size(); i++) { std::cout << "The price of entry " << i << " is " << entries[i].price << std::endl; }
问题3:vector元素算术/比较操作实现
你可以配合C++标准库的<algorithm>和<numeric>头文件快速实现需求,以下是几个功能的参考实现:
#include <algorithm> #include <numeric> // 求平均价格 double OrderBookEntry::computeAveragePrice(std::vector<OrderBookEntry> &entries) { if (entries.empty()) return 0.0; // 累加所有entry的price字段 double total = std::accumulate(entries.begin(), entries.end(), 0.0, [](double sum, const OrderBookEntry& e) { return sum + e.price; }); return total / entries.size(); } // 求最低价格 double OrderBookEntry::computeLowPrice(std::vector<OrderBookEntry>& entries) { if (entries.empty()) return 0.0; auto min_it = std::min_element(entries.begin(), entries.end(), [](const OrderBookEntry& a, const OrderBookEntry& b) { return a.price < b.price; }); return min_it->price; } // 求最高价格 double OrderBookEntry::computeHighPrice(std::vector<OrderBookEntry>& entries) { if (entries.empty()) return 0.0; auto max_it = std::max_element(entries.begin(), entries.end(), [](const OrderBookEntry& a, const OrderBookEntry& b) { return a.price < b.price; }); return max_it->price; } // 求价格差(最高减最低) double OrderBookEntry::computePriceSpread(std::vector<OrderBookEntry>& entries) { return computeHighPrice(entries) - computeLowPrice(entries); }
上述实现用到的标准库方法都属于C++ STL的基础功能,你可以查阅C++标准库文档了解更多vector相关的操作技巧。
内容的提问来源于stack exchange,提问作者oknotok
相关产品推荐
相关产品推荐

