gpt4 book ai didi

c++ - 将 vector 元素复制到 vector 对

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:20 26 4
gpt4 key购买 nike

在我的 C++ 代码中,

vector <string> strVector = GetStringVector();
vector <int> intVector = GetIntVector();

所以我将这两个 vector 合并为一个 vector ,

void combineVectors(vector<string>& strVector, vector <int>& intVector, vector < pair <string, int>>& pairVector)
{

for (int i = 0; i < strVector.size() || i < intVector.size(); ++i )
{
pairVector.push_back(pair<string, int> (strVector.at(i), intVector.at(i)));
}
}

现在这个函数是这样调用的,

vector <string> strVector = GetStringVector();
vector <int> intVector = GetIntVector();
vector < pair <string, int>> pairVector
combineVectors(strVector, intVector, pairVector);
//rest of the implementation

combineVectors 函数使用循环将其他 2 个 vector 的元素添加到 vector 对中。我怀疑这是一种有效的方法,因为这个函数被调用了数百次来传递不同的数据。这可能会导致性能问题,因为每次它都经过循环。

我的目标是将“one go”中的两个 vector 复制到 vector 对。即,不使用循环。我不确定这是否可能。

有没有更好的方法可以在不影响性能的情况下实现这一点?

最佳答案

您已经阐明数组的大小始终相等。这是先决条件。

所以,你的情况如下。这里有 vector A,那里有 vector B。您无法保证 vector A 使用的实际内存和 vector B 使用的实际内存是否彼此相邻。它们可能在任何地方。

现在您要将这两个 vector 组合成第三个 vector C。同样,不能保证 vector C 的内存位置。

因此,就优化而言,您几乎没有什么可做的。您没有任何额外的保证。这非常基本:您有两个字节 block ,这两个 block 需要复制到其他地方。就是这样。这就是必须要做的事情,这就是一切的归结所在,除了完全做到这一点之外,没有其他方法可以完成它。

但是可以做一件事来让事情变得更快一点。 vector 通常会以递增的步骤为其值分配内存,最初会保留一些额外的空间,并且随着值一个接一个地添加到 vector 并最终达到 vector 的保留大小,vector 现在必须获取一个新的更大的空间内存块,将 vector 中的所有内容复制到较大的内存块,然后删除较旧的 block ,然后才将下一个值添加到 vector 。然后循环再次开始。

但是您事先知道要添加到 vector 中的值有多少,因此您只需指示 vector 预先reserve() 足够大,所以它没有当你为它增加值(value)时,它会不断地 self 成长。在现有的 for 循环之前,只需:

pairVector.reserve(pairVector.size()+strVector.size());

现在,for 循环将继续并将新值插入到保证有足够空间的 pairVector 中。

其他一些事情也是可能的。由于您已经声明两个 vector 将始终具有相同的大小,因此您只需要检查其中一个 vector 的大小:

for (int i = 0; i < strVector.size(); ++i )

下一步:at() 执行边界检查。此循环确保 i 永远不会越界,因此 at() 的边界检查也是一些开销,您可以安全地摆脱它:

    pairVector.push_back(pair<string, int> (strVector[i], intVector[i]));

接下来:使用现代 C++ 编译器,编译器应该能够自动优化掉几个冗余的临时文件和此处的临时拷贝。您可能需要帮助编译器一点点,并使用 emplace_back() 而不是 push_back() (假设 C++11 或更高版本):

    pairVector.emplace_back(strVector[i], intVector[i]);

回到循环条件,strVector.size() 在循环的每次迭代中得到评估。现代 C++ 编译器很可能会将其优化掉,但以防万一,您还可以帮助编译器仅检查一次 vector 的 size():

int i=strVector.size();
for (int i = 0; i < n; ++i )

这确实有点困难,但它可能会增加一些额外的执行时间。这几乎是所有明显的优化。实际上,这里获得的最大 yield 是使用 reserve()。其他优化可能会有所帮助,但归根结底就是将一定数量的字节从内存中的一个区域移动到另一个区域。没有什么特别的方法可以做到这一点,这比其他方法更快。

关于c++ - 将 vector 元素复制到 vector 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54954419/

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