gpt4 book ai didi

c++ - 更好地将: reserve vector capacity,预分配为大小或循环回退是什么?

转载 作者:可可西里 更新时间:2023-11-01 17:08:47 34 4
gpt4 key购买 nike

我有一个函数,将指向char数组和段大小的指针作为输入参数,并调用另一个需要std::array<std::string>的函数。这个想法是将输入char数组“分割”成相等的部分,并形成字符串数组。

输入的char数组格式是确定大小的几个较小的数组(或字符串),它们串联在一起。尽管它们可能是零,但并不假定它们为零终止。段大小5和元素数量10的示例:

char k[] = "1234\0001234\0001234\0001234\0001234\0001234\0001234\0001234\0001234\0001234\000";
char m[] = "1234\00067890987654321\000234567809876\0005432\000\000\0003456789098";
char n[] = "12345678909876543211234567890987654321123456789098";

所有char数组的长度为51(段*元素+ 1)。我的目标是使函数有效地利用资源,最重要的是执行时间。

由于有很多方法可以给猫皮,所以我有两种(或三种)方法可以解决这个问题,问题是,哪一种“更好”?我的意思是说更快,更少浪费资源。我不是专业人士,所以请耐心等待。

在这里, values被预先分配,然后每个字符串分配一个值。
void myfnc_1(void *a_src, uint32_t a_segment) {
// a_segment = 5 for example
size_t nSize = GetSize(); // another method, gets 10
std::vector<std::string> values(nSize);
char* v = a_src; // take k, n or m for example

for (size_t i = 0; i < nSize; ++i) {
values.at(i).assign(v, a_segment);
v += a_segment;
}
}

这里,不分配 vector ,但是每次迭代都会添加一个新字符串。
void myfnc_1(void *a_src, uint32_t a_segment) {
size_t nSize = GetSize();
std::vector<std::string> values();
char* v = a_src;

for (size_t i = 0; i < nSize; ++i) {
values.push_back("");
values.back().assign(v, a_segment);
v += a_segment;
}
}

可能还有第三种方式,那就更好了。我对 vector 不那么有经验,所以我不清楚。如果段长度和元素数量通常较大(5、10)或较小(100、10000),会有所不同吗?

第一篇文章,大粉丝:)

最佳答案

避免动态重新分配时,可以达到更好的性能,因此,请尝试使 vector 存储器足够大以容纳所有元素。

您的第一个解决方案将更加高效,因为如果nSize大于默认 vector 容量,则第二个解决方案将需要重新分配以存储所有元素。

正如Melkon所说,reserve更好:

void myfnc_1(void *a_src, uint32_t a_segment) {
size_t nSize = GetSize();
std::vector<std::string> values;
values.reserve( nSize );
char* v = a_src;

for (size_t i = 0; i < nSize; ++i) {
values.push_back( std::string( v, a_segment ) );
v += a_segment;
}
}

关于c++ - 更好地将: reserve vector capacity,预分配为大小或循环回退是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32199388/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com