在C ++中寻找一个动态字符串指针数组的简单包装器

时间:2011-08-24 15:47:59

标签: c++

我需要一个简单的类来包装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函数。

3 个答案:

答案 0 :(得分:2)

您应该使用

std::vector<std:string> 

如果您想将char字符串传递给c函数,只需使用 string::c_str

即可

答案 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会为你效力吗?