草庐IT

stdvector

全部标签

c++ - 快速复制 `std::vector<std::uint8_t>`

我有一个std::vector,需要复制。这只需调用复制构造函数即可完成。我的分析结果显示,MicrosoftVisualC++(msvc100)实现使用std::uninitialized_copy内部。这将一个接一个地复制每个元素。在这种情况下,可以通过一次复制整个内存块来完成更优化的复制(例如memcpy可能会这样做)。换句话说,这可能是一个重要的优化。有没有办法强制vector使用这种优化的方法?注意:我尝试过使用std::basic_string,它的性能确实更好,但它还有其他问题。 最佳答案 此答案并非特定于msvc10

c++ - 快速复制 `std::vector<std::uint8_t>`

我有一个std::vector,需要复制。这只需调用复制构造函数即可完成。我的分析结果显示,MicrosoftVisualC++(msvc100)实现使用std::uninitialized_copy内部。这将一个接一个地复制每个元素。在这种情况下,可以通过一次复制整个内存块来完成更优化的复制(例如memcpy可能会这样做)。换句话说,这可能是一个重要的优化。有没有办法强制vector使用这种优化的方法?注意:我尝试过使用std::basic_string,它的性能确实更好,但它还有其他问题。 最佳答案 此答案并非特定于msvc10

c++ - 从 std::vector 中删除前 N 个元素

我似乎想不出一种可靠的方法(也可以压缩内存)从std::vector中删除前N个元素。怎么做呢? 最佳答案 使用.erase()方法://RemovethefirstNelements,andshifteverythingelsedownbyNindicesmyvec.erase(myvec.begin(),myvec.begin()+N);这将需要从索引N+1到末尾复制所有元素。如果你有一个很大的vector并且会经常这样做,那么使用std::deque代替,它可以更有效地从前面删除元素。

c++ - 从 std::vector 中删除前 N 个元素

我似乎想不出一种可靠的方法(也可以压缩内存)从std::vector中删除前N个元素。怎么做呢? 最佳答案 使用.erase()方法://RemovethefirstNelements,andshifteverythingelsedownbyNindicesmyvec.erase(myvec.begin(),myvec.begin()+N);这将需要从索引N+1到末尾复制所有元素。如果你有一个很大的vector并且会经常这样做,那么使用std::deque代替,它可以更有效地从前面删除元素。

c++ - vector 与 map 性能混淆

edit:我专门将std::vector的linear搜索操作与std::mapbinary搜索操作,因为这似乎与Herb的声明有关。我知道使用二分搜索会将性能从O(N)提高到O(logN)但这不会测试Herb的主张BjarneStroustrup和HerbSutter最近都谈到了std::vector在人们期望使用std::list的情况下是多么的棒,因为链表遍历期间缓存未命中的成本。(见http://channel9.msdn.com/Events/Build/2014/2-661在48分钟标记处)Herb进一步声明,对有序vector的操作甚至比std::map还要快(参见htt

c++ - vector 与 map 性能混淆

edit:我专门将std::vector的linear搜索操作与std::mapbinary搜索操作,因为这似乎与Herb的声明有关。我知道使用二分搜索会将性能从O(N)提高到O(logN)但这不会测试Herb的主张BjarneStroustrup和HerbSutter最近都谈到了std::vector在人们期望使用std::list的情况下是多么的棒,因为链表遍历期间缓存未命中的成本。(见http://channel9.msdn.com/Events/Build/2014/2-661在48分钟标记处)Herb进一步声明,对有序vector的操作甚至比std::map还要快(参见htt

c++ - 否定 std::vector 的最快方法

假设我有一个double的std::vector,即std::vectorMyVec(N);N如此之大以至于性能很重要。现在假设MyVec是一个非平凡vector(即它不是一个零vector,但已被某些例程修改)。现在,我需要negated版本的vector:我需要-MyVec。到目前为止,我一直在通过实现它std::transform(MyVec.cbegin(),MyVec.cend(),MyVec.begin(),std::negate());但是,真的,我不知道这是明智之举,还是在我看来这只是太天真了。我做得对吗?或者std::transform在这种情况下只是一个super慢

c++ - 否定 std::vector 的最快方法

假设我有一个double的std::vector,即std::vectorMyVec(N);N如此之大以至于性能很重要。现在假设MyVec是一个非平凡vector(即它不是一个零vector,但已被某些例程修改)。现在,我需要negated版本的vector:我需要-MyVec。到目前为止,我一直在通过实现它std::transform(MyVec.cbegin(),MyVec.cend(),MyVec.begin(),std::negate());但是,真的,我不知道这是明智之举,还是在我看来这只是太天真了。我做得对吗?或者std::transform在这种情况下只是一个super慢

c++ - 为什么要重新分配 vector 拷贝而不是 move 元素?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:Howtoenforcemovesemanticswhenavectorgrows?insert、push_back和emplace(_back)会导致std的重新分配::vector。我很困惑地看到以下代码在重新分配容器时复制元素而不是move它们。#include#includestructfoo{intvalue;explicitfoo(intvalue):value(value){std::coutfoos;foos.emplace_back(1);foos.emplace_back(2);}在我的特

c++ - 为什么要重新分配 vector 拷贝而不是 move 元素?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:Howtoenforcemovesemanticswhenavectorgrows?insert、push_back和emplace(_back)会导致std的重新分配::vector。我很困惑地看到以下代码在重新分配容器时复制元素而不是move它们。#include#includestructfoo{intvalue;explicitfoo(intvalue):value(value){std::coutfoos;foos.emplace_back(1);foos.emplace_back(2);}在我的特