将std :: string解释为char_type的std :: vector?

Anz*_*rio 7 c++ vector c++11 array-view

我有一个template<typename T>功能,需要一个const vector<T>&.在说的功能,我有载体cbegin(),cend(),size(),和operator[].据我了解,双方stringvector用连续的空间,所以我在想,如果我能在一个优雅的方式重新使用两种数据类型的功能.

可以std::string重新解释为std::vector(适当的)char_type吗?如果是这样,限制是什么?

Zan*_*ynx 14

如果你把你的模板只为类型const T&和使用begin(),end()等等,这些功能矢量和串份额那么你的代码可以使用两种类型的工作.


Ser*_*eyA 7

去STL方式并使用迭代器.接受迭代器开始,迭代器结束.它将适用于所有可能的容器,包括非容器,如流.


Dav*_*vid 6

无法保证布局stringvector将是相同的.它们理论上可能是,但它们可能不是任何常见的实现.因此,你不能安全地做到这一点.请参阅Zan的答案以获得更好的解决方案.

让我解释一下:如果我是一个标准的库实现者,并决定像这样实现std :: string ....

template ...
class basic_string {
public:
    ...
private:
    CharT* mData;
    size_t mSize;
};
Run Code Online (Sandbox Code Playgroud)

并决定像这样实现std :: vector ...

template ...
class vector {
public:
    ...
private:
    T* mEnd;
    T* mBegin;
};
Run Code Online (Sandbox Code Playgroud)

当您reinterpret_cast<string*>(&myVector)最终将指向数据末尾的指针解释为指向数据开头的指针,并将指向数据开头的指针解释为数据大小.如果成员之间的填充不同,或者有额外的成员,它甚至可能变得更加怪异,也更加破碎.

所以,是的,为了使它们可能工作,它们都需要存储连续的数据,但是它们还需要相当多的其他工具才能实现相同的工作.


Yak*_*ont 5

std::experimental::array_view<const char> n4512表示字符的连续缓冲区.

编写自己的并不难,它解决了这个问题和(根据我的经验)更多.

字符串和向量都与数组视图兼容.

这使您可以将实现移动到一个.cpp文件中(而不是暴露它),提供与执行相同的性能std::vector<T> const&,可能是相同的实现,避免重复代码,并使用轻量级连续缓冲区类型擦除(其中包含美味的关键字) ).