【问题标题】:Get the address of the element in a vector获取向量中元素的地址
【发布时间】:2019-07-23 03:48:58
【问题描述】:

假设我需要这样做

我有一个函数,比如:

int dbs_access(chat* name, char* sql, void* outbuf, unsigned int buflen, int* outresutl)
{ do some query here and output result}

我想从DBS获取一些数据,所以我需要一些缓冲区并调用上面的函数,因为我不知道表中有多少条记录,所以我不能使用数组,我不想要使用 new 或 malloc 来获取一些内存,因为在这里释放内存可能是一个问题。因此我想使用矢量。但我不确定 c++ 标准是否能保证这一点,有什么看法吗?

unsigned int count;

dbs_access(...,"select count(*) from..",&count,sizeof(count),...)
std::vector records[count];
assert(records.size()==count)
dbs_access(...,"select from..",&records[0],records.size(),...)

【问题讨论】:

  • 你可能想要std::vector<char> 那里 - 你需要给它一个类型,并为 UTF16 字符等提供灵活性,records.size()*sizeof(records[0]),因为size() 给出了元素的数量,而不是总大小。
  • 你是对的,这是一个错误。
  • 附注:如果记录的数量非常大,上述使用向量的方法可能会给您带来问题,因为向量保证在连续块中。在这种情况下,列表或双端队列可能是更好的选择。免责声明:不确切知道您的要求和限制。

标签: c++


【解决方案1】:

records.data() 会给你指针,是的,在这里使用向量是可以接受的,尽管你可能想像这样初始化大小:

 std::vector records(count); 

(而不是创建向量数组)

【讨论】:

    【解决方案2】:

    编辑:停止新闻!我没有注意到您可能不想要&records[0]。这并没有像我想的那样做,因为我没有注意到这一行:

    std::vector records[count];
    

    那行可能不是你想要的,所以改为:

    std::vector records(count);
    

    然后您将拥有您可能真正想要的东西,我的以下答案将再次适用。


    std::vectorstores data in a continuous space after C++0x:

    来自n2798(C++0x草案)::

    23.2.6 类模板向量[vector]

    1 向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销)恒定时间的最后插入和擦除操作;在中间插入和>>擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是除 bool 之外的某种类型,那么它>>服从恒等式 &v[n] == &v[0] + n for all 0

    所以,像&records[0] 这样的东西应该没问题,尽管有些人认为它不是最好的。 std::vector::data()(或 records.data() 在您的情况下)通常是首选,只要您使用 C++11 或更高版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 2019-08-22
      • 2016-02-26
      • 2018-08-23
      • 1970-01-01
      • 2012-03-20
      相关资源
      最近更新 更多