![](/img/trans.png)
[英]How to convert auto (for vector<string>) from c++11 to 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.