【发布时间】:2021-12-20 15:18:25
【问题描述】:
我看过这个讨论 (Concatenating two std::vectors),但它涉及 combining(如 moving)两个 std::vector 数组。
我有 三个 std::vectors,我正在使用 C++17:
m_mapHist[m_eHistAssign][strName]m_mapScheduleHist[m_eHistAssign][strName]m_mapScheduleFutureHist[m_eHistAssign][strName]
每个向量都是std::vector<COleDateTime> 类型。我不想改变这些向量。相反,我想将它们(我猜是copy)组合成一个临时的单个向量,这样我就可以只将一个向量传递给另一个类进行处理。
目前我正在通过迭代手动执行此操作:
std::vector<COleDateTime> vecAssignmentDate;
// Past items from the history database
if (m_mapHist[m_eHistAssign].find(strName) != m_mapHist[m_eHistAssign].end())
{
for (const auto& historyItemDate : m_mapHist[m_eHistAssign][strName])
{
vecAssignmentDate.push_back(historyItemDate);
}
}
// Past items on the active schedule
if (m_mapScheduleHist[m_eHistAssign].find(strName) != m_mapScheduleHist[m_eHistAssign].end())
{
for (const auto& historyItemDate : m_mapScheduleHist[m_eHistAssign][strName])
{
vecAssignmentDate.push_back(historyItemDate);
}
}
// Future items (both on the active schedule and in the history database)
if (m_mapScheduleFutureHist[m_eHistAssign].find(strName) != m_mapScheduleFutureHist[m_eHistAssign].end())
{
for(const auto &historyItemDate : m_mapScheduleFutureHist[m_eHistAssign][strName])
{
vecAssignmentDate.push_back(historyItemDate);
}
}
有没有更简单的方法来创建这个临时向量?
【问题讨论】:
-
您提供的链接已经有了不错的答案。
std::copy和std::back_inserter似乎适合之前的std::vector::reserve如果你愿意的话。示例:std::copy(a.begin(),a.end(),std::back_inserter(combined); -
你说的是“搬家”,但搬家真的对你有用吗?还是您需要保留原始的 3 个单独的向量?如果您不关心保留 3 个原件,那么移动将是迄今为止最有效的方法。但是,什么都不做可能会更快。这意味着调整您尝试调用的算法,使其可以接受 3 个不同的迭代器对,而不是单个向量的单个对。
-
@CodyGray 我不想动。我声明我想保持原来的 3 不变。我正在尝试
std::copy。 -
@Staz 我确认使用
std::copy工作正常。谢谢。现在查看一些答案。 -
里面有多少数据?请注意,
std::vector在调试模式下非常慢,在发布模式下非常快。我想知道缓慢的调试速度是否是这个问题的动机。