我需要一个简单的类来包装c样式的指针字符串数组,即char **
我需要对包装器进行最少的操作,包括添加元素(const或非const),迭代,随机访问和查询大小。我开始使用如下所示的std :: vector但我不喜欢它,原因如下所述
这是我的开始
struct CstrVector
{
CstrVector(){}
char *convertToC(const std::string & str)
{
char *c = new char[str.size()+1];
std::strcpy(c, str.c_str());
return c;
}
void add( const char* c)
{
//??
}
void add(const std::string& str )
{
data.push_back(convertToC(str));
}
void add(const std::string& s, unsigned int pos )
{
if( pos < data.size())
{
data[pos] = convertToC(s);
}
}
~CstrVector()
{
for ( size_t i = 0 ; i < data.size() ; i++ )
{
delete [] data[i];
}
}
char ** vdata;
std::vector<char*> data; // I want to replace this with char ** vdata
};
为什么不使用
std::vector<char*>
我没有看到它有什么好处,因为我仍然必须分配并释放容器外的内存(std :: vector)>
为什么不使用
std::vector<std:string>
因为我希望能够轻松地将数组传递给将操纵/更改其内容的C函数。
答案 0 :(得分:2)
答案 1 :(得分:2)
您仍然可以使用std::vector<char *>
。 vector
保证以连续的方式存储其内容,更准确地说是在数组中。如果要将char **
数组传递给C函数,只需传递向量中第一个元素的地址:
void c_function(char ** data);
std::vector<char *> myvec;
...
c_function(&myvec[0]);
注意:
char*
std::vector<char*>
而不适用于std::vector<std::string>
!答案 2 :(得分:1)
Boost ptr_vector会为你效力吗?