我正在尝试平均一个大的(~1.000.000数据集)向量。我已经有这样的数据:
struct data {
std::string alias;
double id;
std::string timestamp;
double value;
};
现在我想平均一天的所有值。时间戳是这样的:“20-NOV-12 10.52.21.260000000 AM”。我只关心substr(0,8),它包含描述当天的字符串部分。 目前我有这个:
typedef std::vector<std::tuple<std::string, size_t, double>> days;
days&& average_days(const std::vector<data> _d)
{
days ret;
for(auto &d: _d) {
bool found = false;
int count = 0;
double val= 0.0;
for(size_t i = 0; i < ret.size(); i++) {
std::string day = d.alias.substr(0,8);
auto t = ret[i];
if (std::get<0>(t) == day) {
found = true;
std::string ali = std::get<0>(t);
size_t coun = std::get<1>(t) + 1;
double val = std::get<2>(t) + d.value;
ret[i] = std::make_tuple(ali, coun, val);
}
val = std::get<2>(t);
}
if (!found){
ret.push_back(std::make_tuple(d.alias.substr(0,8) ,1, val));
}
}
return std::move(ret);
}
这给了我一个邪恶的例外(邪恶的例外=分段违规)。我无法理解这件事。 这样做的最好和最快的方法是什么?
答案 0 :(得分:5)
您的程序很可能有未定义的行为。无论是什么导致您遇到的例外,请点击此处:
days&& average_days(const std::vector<data> _d)
// ^^^^^^
{
days ret;
// ...
return std::move(ret);
}
您正在返回对本地对象的引用。到接收到此返回引用的变量时,由于超出范围,引用的对象将被绑定。
因此,您基本上会返回一个悬空引用,并且取消引用会将未定义的行为注入您的程序。
只需以这种方式返回您的对象(请注意,您可能希望通过引用而不是按值传递带有百万条的数据的传感器!):
days average_days(const std::vector<data>& _d)
// ^^^^ ^
// No rvalue reference! Pass by reference!
{
days ret;
// ...
return ret;
// ^^^
// No std::move()!
}