有没有办法做到这一点:
std::vector<char[foo]> bar;
我需要一个char[foo]
的连续数组,但直到运行时我才知道它的长度。我需要能够动态添加char[foo]
块。
我需要内部数组的大小正确,所以如果foo
是3:
[[1,2,3] [4,5,6] ...... [x,y,z]]
我可以自己实施但不想重新发明轮子。
答案 0 :(得分:5)
我建议使用
std::vector< std::vector< char > >
击> <击> 撞击>
std::vector
的内存是连续的。
好吧,过了一会儿,似乎整个记忆必须是连续的,这会改变一切......
对于这种情况,您可以直接使用std::vector< char >::insert( pos, begin, end )
到insert
整个“块”。
类似的东西: (我没有测试它,但你会得到这个想法)
std::vector< char > bar;
// ..
{
std::vector< char > buff( foo );
// fill buff
bar.insert( bar.end(), buff.begin(), buff.end() );
}
请记住,这可能/将导致内部内存和元素的多个副本的重新分配,但我们正在谈论char
,所以这不是什么大问题。
如果您了解std::vector::reserve
的最终尺寸,则可以使用bar
来避免这些重新分配。
答案 1 :(得分:3)
我自己创建一个容器类,在内部使用std::vector<char>
,并创建一个包装器slice
类,它包含指向容器类的指针和向量的索引。容器类将保持长度foo
。容器将有一个迭代器返回切片,每个slice
将有一个返回char
的迭代器。
[编辑] 此解决方案还分配连续的内存。
答案 2 :(得分:0)
问题重写后,您可能正在寻找std::vector< std::array<char, 3> >
内存对所有元素都是连续的。假设最后一个dimention确实是构建时间const。
示例:
std::vector< std::array<char, 3> > bar;
std::array<char, 3> foo = { 'a', 'b', 'c' };
bar.insert(bar.end(), 10, foo);
答案 3 :(得分:-3)
std::vector<char> bar(foo)
在向量中构造foo字符,但由于char是内置类型,因此不会调用构造函数,因此在初始化之前它将是垃圾值。
而是使用std::vector<char> bar(foo, char())
填充初始化的字符。