[英]Build a vector as a subset of another one without copying
设v
是向量。 我想w
是的一个子集v
指数之间的from
和to
。 我可以这样做
std::vector<T> w(v.begin() + from, v.begin() + to);
但是,我不打算将来使用v
。 因此,我不需要在from
和to
之间复制数据。 我需要创建一个指向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非常高效,因为它将其内容存储在数组桶中。 它不仅仅和矢量一样高效,但它实际上可能足够好,因为它只有一个额外的间接层。 大致这是不同的:
参考: https : //en.cppreference.com/w/cpp/container/deque
它取决于你增长和缩小你的向量,但deque缩小和增长,而不是复制任何元素,它只是桶分配/释放。 因此,在某些情况下,它可以比矢量更高效。
应该很快就会推出。 在此期间,您的选择是:
使用std::string<T>
而不是vector
,因此使用std::string_view
。
制作自己的视图类。 说,
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.