c ++ mysqlpp :: storequeryresult和std :: vector

时间:2015-02-10 11:40:41

标签: c++ vector

我想知道是否有更快捷的方法将我的数据从mysqlpp :: storequeryresult复制到std :: vector。

我的例子如下: 我在StoreQueryResult中使用query.store()存储我的查询结果,我的结果是例如一个表格,其中一列有双打。现在我想将那些双打复制到std :: vector中。我现在这样做的方法是使用[] []运算符访问每个双精度数并将其复制到for循环中的向量。

这样可行,但由于我在循环中复制了277000双,所以非常耗时。有没有办法将列复制到我的向量?事情是我的其他函数在参数列表中使用std :: vectors。或者我可以改变我的函数来调用StoreQueryResult我猜,但我会优先选择std :: vector。

这是我的简化代码:

void foo()
{
   vector<double> vec;
   mysqlpp::StoreQueryResult sqr;
   Query query;
   query << "SELECT * FROM tablename";
   sqr = query.store();
   vec.reserve(sqr.num_rows());
   vec.resize(sqr.size());
      for(int i=0; i != vec.size(); i++)
      {
       vec[i] = sqr[i]["my_column"]; 
      }
}

我想要类似的东西:

vec = sqr["my_column"]  // when my_column is a field with doubles
提前谢谢。

马丁

2 个答案:

答案 0 :(得分:0)

最终,如果您需要复制,那么您需要复制,无论您是自己编写循环还是获取库函数,都不是特别相关。

reserve

答案 1 :(得分:0)

您可能希望创建一个矢量,但实际上只会访问和使用某些值。

在这种情况下,我们可能会延迟从mysqlpp::String到另一种数据类型的转换:

std::vector<mysqlpp::String> data(res.num_rows());
for(size_t i=0, n=res.num_rows(); i<n; ++i)
{
    data[i] = std::move(res[i]["value"]);
}

这里发生了一些事情:

  1. 我们正在创建存储vector的{​​{1}}。这是一个有趣的数据类型,可以转换为许多其他类型。在您的情况下,您使用的是mysqlpp::String
  2. 我们获取大小一次,存储它,然后使用该值。这是微优化,同时使用operator double () const而不是++i;它们不会累加多个周期,但应该使用,以保持代码的优化精神。
  3. 我们移动数据,而不是复制数据。如果您以前没有遇到过,请参阅std::move
  4. 如果那时你有类似的东西:

    i++

    您只会在½值上运行转换例程。

    当然,如果您打算多次使用结果向量,您实际上会一次又一次地开始运行相同的转换。所以这种“优化”实际上会损害性能。