繁体   English   中英

C++11 Vector::data() 等效于 C++98

[英]C++11 Vector::data() equivalent in 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(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 ++ 98吗? 我担心的是取决于 &data[0]。

==================================================== ===========

原始问题:

我需要创建一个 char** 类似环境的类型 - 一个字符串数组。 输入是一个使用 '\0' 作为分隔符的字符串,并以双 '\0' 结尾。

目前,我的代码如下所示:

    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;
    }

在 C++11 上,std::vector 具有 data() 方法,它可以在一次迭代中为我创建它 - 我只需要创建 vector<char*>,填充它,并获取它的数据表示。

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

谢谢

它几乎不一样。 vector<char*>.data()返回一个 char** 但在向量被销毁之前,您必须释放strndup分配的内容以避免 memory 泄漏

CHAR** data = new CHAR*[count + 1]; 您创建一个char*数组。 你必须释放它以及释放strndup 由您决定首选哪个选项

回复晚了非常抱歉。 OP 似乎暗示 std::vector::data 未在 C++98 中定义。 这个对吗? 我发现旧版本的 gcc 确实支持这一点,但 AIX 编译器不支持。 我认为 AIX 是错误的。 cppreference.com 似乎表明它在 C++11 之前可用。

无论如何,对于 OP 问题,为什么会有 std::vector<char*>? 为什么不使用字符串 class? 例如, std::vector<std::string>std::vector<CString>等?

为了回答当编译器不提供这个时使用什么而不是std::vector::data<T>的问题(我认为这是不正确的,但我可能是错的),我发现以下实现是有效的。

#include <vector>
struct T{}; // just to have a type to use
int main() {
  std::vector<T> v;
  v.push_back(T());
  T* p1=v.data();
  T* p2=&*v.begin();
  T* p3==&v[0];
  T* p4=&v.front();
  // p1==p2==p3==p4 should hold.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM