C++ C++;11向量::数据()等价于C++;98 编辑:

C++ C++;11向量::数据()等价于C++;98 编辑:,c++,vector,c++98,C++,Vector,C++98,阅读评论和答案后,我了解到以下内容可能是C++98中的合法实现: class Environ { private: std::vector<char*> data; public: Environ(const CHAR *environmentBlock) { for (const CHAR *s = environmentBlock; *s; s += strlen(s) + 1) data.push_back

阅读评论和答案后,我了解到以下内容可能是C++98中的合法实现:

class Environ {

private:

    std::vector<char*> data;

public:

    Environ(const CHAR *environmentBlock)
    {
        for (const CHAR *s = environmentBlock; *s; s += strlen(s) + 1)
            data.push_back(strdup(s));

        data.push_back(NULL);
    }

    char** Data(){
        return &data[0]; // data should have at least one item (NULL)
    }

    ~Environ()
    {
        for (size_t i = 0; i < data.size(); i++)
            free(data[i]);
    }
};
在C++11上,std::vector有data()方法,它可以在一次迭代中为我创建它-我只需要 需要创建向量,填充它,并获得它的数据表示

C++98上有类似的东西吗


谢谢

差不多不一样了。
vector.data()
返回一个字符**,但在销毁该向量之前,必须释放由
strndup
分配的内容,以避免内存泄漏


CHAR**data=new CHAR*[count+1]创建
char*
数组。您必须释放它以及释放
strndup
。选择哪个选项取决于您

本质上返回指向向量第一个元素的指针。你可以通过
&向量[0]
来获取。我不太理解你的代码,但是如果你使用
std::transform
或类似的方法,你不需要
data()
。不要期望能够通过
数据()
在向量中插入元素(更改其大小),使用
向量[0]
时不能有一个警告,即向量不能为空。这就是
data()
&vector[0]
之间的一大区别,因为
data()
适用于空向量。
    Environ(const CHAR *environmentBlock)    {
        size_t count = 0;
        for (const CHAR *s = environmentBlock; *s; s += strlen(s) + 1)
            count++;

        // Allocate 1 extra entry for the last NULL entry.
        CHAR** data = new CHAR*[count + 1];

        CHAR **entry = data;
        size_t length = 0;
        for (const CHAR *s = environmentBlock; *s; s += length + 1, entry++)
        {
            length = strlen(s);
            *entry = strndup(s, length);
        }
        *entry = NULL;
    }