繁体   English   中英

无需复制即可将向量构建为另一个向量的子集

[英]Build a vector as a subset of another one without copying

v是向量。 我想w是的一个子集v指数之间的fromto 我可以这样做

std::vector<T> w(v.begin() + from, v.begin() + to);

但是,我不打算将来使用v 因此,我不需要在fromto之间复制数据。 我需要创建一个指向v.begin() + from的向量,并且长度to - from 应该释放v使用的其余内存。 请注意,我很好,如果它是v被重新定义(我只是交换到w之后,如果我想反正)。

有可能吗?

如果要使用vector ,则无法避免复制。 如果你想确保释放未使用的内存,你可以这样做:

std::vector<T> w(v.begin() + from, v.begin() + to);
std::vector<T>().swap(v);

这应该是矢量的技巧。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v{ 11, 22, 33, 44, 55, 66, 77, 88, 99 };
    constexpr size_t from = 3;
    constexpr size_t to = 7;

    if(to < v.size() - 1)
        v.erase(v.begin() + to, v.end());

    if(from > 0)
        v.erase(v.begin(), v.begin() + from - 1);

    v.shrink_to_fit();

    for(auto i : v)
        cout << i << ' ';
    cout << endl;
}

您应该使用std :: deque,并将所有元素从begin()跳转到begin()+ front,从end()跳到end()。 这样就可以从第一个存储桶的前面和最后一个存储桶的末端中释放出来的内存减去一小部分内存。 std :: deque非常高效,因为它将其内容存储在数组桶中。 它不仅仅和矢量一样高效,但它实际上可能足够好,因为它只有一个额外的间接层。 大致这是不同的:

  • std :: vector [i] - >返回缓冲区[i]
  • std :: deque [i] - > buckets [i] - > return bucket [i];

参考: https//en.cppreference.com/w/cpp/container/deque

它取决于你增长和缩小你的向量,但deque缩小和增长,而不是复制任何元素,它只是桶分配/释放。 因此,在某些情况下,它可以比矢量更高效。

应该很快就会推出。 在此期间,您的选择是:

  1. 使用std::string<T>而不是vector ,因此使用std::string_view

  2. 制作自己的视图类。 说,

     template<class Iterator> class view { Iterator b, e; public: view(Iterator b, Iterator e): b(b), e(e) {} auto &operator[](std::size_t i) { return *(b[i]); } auto const &operator[](std::size_t i) const { return *(b[i]); } auto begin() const { return b; } auto end() const { return e; } auto size() const { return e - b; } }; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM