将元素从 std::vector<T1> 移动到 std::vector<std::pair<T1,T2>>
Moving elements from std::vector<T1> to std::vector<std::pair<T1,T2>>
从某种类型的向量 (T1) std::move 元素到相同类型 (T1) 和另一种类型的 std::pair 向量的最正确和最有效的方法是什么(T2)?
也就是说MoveItems()应该怎么写?
#include <iostream> // For std::string
#include <string> // For std::string
#include <vector> // For std::vector
#include <utility> // For std::pair
using std::vector;
using std::string;
using std::pair;
vector<string> DownloadedItems;
vector<pair<string,bool>> ActiveItems;
vector<string> Download()
{
vector<string> Items {"These","Words","Are","Usually","Downloaded"};
return Items;
}
void MoveItems()
{
for ( size_t i = 0; i < DownloadedItems.size(); ++i )
ActiveItems.push_back( std::pair<string,bool>(DownloadedItems.at(i),true) );
}
int main()
{
DownloadedItems = Download();
MoveItems();
return 0;
}
感谢您的宝贵时间和帮助,我真的很感激!
您可以做的一些事情:
在 MoveItems()
开始时,调用 ActiveItems.reserve(DownloadedItems.size());
。这可以防止您的数组在您将内容推入其中时调整大小。
调用 push_back
而不是调用 emplace_back
。 Here是对这样做的好处的解释。
值得注意的是,在此示例中,您可以通过从头构建 std::pair
而不是复制数据来停止向新数据结构的复制。
void MoveItems()
{
ActiveItems.reserve(DownloadedItems.size());
for (auto& str : DownloadedItems)
ActiveItems.emplace_back(std::move(str), true);
}
N.B.: 对于像您示例中的字符串一样小的字符串,由于 SSO,移动的成本可能与复制的成本相同,或者如果实施决定清空源,则可能会稍微贵一些无论如何。
从某种类型的向量 (T1) std::move 元素到相同类型 (T1) 和另一种类型的 std::pair 向量的最正确和最有效的方法是什么(T2)?
也就是说MoveItems()应该怎么写?
#include <iostream> // For std::string
#include <string> // For std::string
#include <vector> // For std::vector
#include <utility> // For std::pair
using std::vector;
using std::string;
using std::pair;
vector<string> DownloadedItems;
vector<pair<string,bool>> ActiveItems;
vector<string> Download()
{
vector<string> Items {"These","Words","Are","Usually","Downloaded"};
return Items;
}
void MoveItems()
{
for ( size_t i = 0; i < DownloadedItems.size(); ++i )
ActiveItems.push_back( std::pair<string,bool>(DownloadedItems.at(i),true) );
}
int main()
{
DownloadedItems = Download();
MoveItems();
return 0;
}
感谢您的宝贵时间和帮助,我真的很感激!
您可以做的一些事情:
在 MoveItems()
开始时,调用 ActiveItems.reserve(DownloadedItems.size());
。这可以防止您的数组在您将内容推入其中时调整大小。
调用 push_back
而不是调用 emplace_back
。 Here是对这样做的好处的解释。
值得注意的是,在此示例中,您可以通过从头构建 std::pair
而不是复制数据来停止向新数据结构的复制。
void MoveItems()
{
ActiveItems.reserve(DownloadedItems.size());
for (auto& str : DownloadedItems)
ActiveItems.emplace_back(std::move(str), true);
}
N.B.: 对于像您示例中的字符串一样小的字符串,由于 SSO,移动的成本可能与复制的成本相同,或者如果实施决定清空源,则可能会稍微贵一些无论如何。