我可以在c ++中使用可变修改的向量吗?

时间:2014-01-03 08:08:42

标签: c++ stdvector

有没有办法做到这一点:

std::vector<char[foo]> bar;

我需要一个char[foo]的连续数组,但直到运行时我才知道它的长度。我需要能够动态添加char[foo]块。

我需要内部数组的大小正确,所以如果foo是3:

[[1,2,3] [4,5,6] ...... [x,y,z]]

我可以自己实施但不想重新发明轮子。

4 个答案:

答案 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())填充初始化的字符。