相关疑难解决方法(0)

C++中的POD类型是什么?

我有几次遇到这个术语POD型.这是什么意思?

c++ types c++-faq

919
推荐指数
8
解决办法
29万
查看次数

什么是聚合和POD以及它们如何/为何特殊?

常见问题解答涉及聚合和POD,并涵盖以下材料:

  • 什么是聚合
  • 什么是POD(普通旧数据)?
  • 它们有什么关系?
  • 它们如何以及为何特别?
  • C++ 11有什么变化?

c++ aggregate standard-layout c++11 c++17

525
推荐指数
6
解决办法
13万
查看次数

如何实现std :: string?

我很想知道如何实现std :: string以及它与c字符串的区别?如果标准没有指定任何实现,那么任何带有解释的实现都会很好,它如何满足标准给出的字符串要求?

c++ string std cstring

53
推荐指数
4
解决办法
5万
查看次数

在定位C++ 03时使用std :: basic_string <t>作为连续缓冲区是否合理?

我知道在C++ 03中,从技术上讲,std::basic_string模板不需要具有连续的内存.但是,我很好奇有多少实现存在于实际利用这种自由的现代编译器.例如,如果想要用来basic_string接收某些C API的结果(如下面的例子),分配一个向量只是为了立即将它变成一个字符串似乎很愚蠢.

例:

DWORD valueLength = 0;
DWORD type;
LONG errorCheck = RegQueryValueExW(
        hWin32,
        value.c_str(),
        NULL,
        &type,
        NULL,
        &valueLength);

if (errorCheck != ERROR_SUCCESS)
    WindowsApiException::Throw(errorCheck);
else if (valueLength == 0)
    return std::wstring();

std::wstring buffer;
do
{
    buffer.resize(valueLength/sizeof(wchar_t));
    errorCheck = RegQueryValueExW(
            hWin32,
            value.c_str(),
            NULL,
            &type,
            &buffer[0],
            &valueLength);
} while (errorCheck == ERROR_MORE_DATA);

if (errorCheck != ERROR_SUCCESS)
    WindowsApiException::Throw(errorCheck);

return buffer;
Run Code Online (Sandbox Code Playgroud)

我知道像这样的代码可能会略微降低可移植性,因为它意味着它std::wstring是连续的 - 但我想知道这个代码是多么不可移植.换句话说,编译器如何实际利用具有非连续内存的自由?


编辑:我更新了这个问题,提到C++ 03.读者应注意,在定位C++ 11时,标准现在要求basic_string是连续的,因此在定位该标准时,上述问题不是问题.

c++ string winapi stl c++03

32
推荐指数
2
解决办法
3480
查看次数

写入std :: string是否合法?

在std :: string中,只有const成员来获取数据,如c_str().但是我可以获得对字符串via的第一个元素的引用operator[],我可以写入它.

例如,如果我有功能:

void toupper(char *first,char *last_plus_one);
Run Code Online (Sandbox Code Playgroud)

我可以直接写向量获取指向第一个元素的指针:

vector<char> message // has "Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)

我可以用std :: string做同样的事情吗?

string message="Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)

标准是否保证内存的位置实际上是线性的?即:

&(*(message.begin()+n)) == &message[n]
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ string standards

14
推荐指数
3
解决办法
3663
查看次数

string :: c_str()是否允许在堆上分配任何东西?

如果我需要在一个需要确保没有分配任何内容的情况下从一个NUL终止的char阵列中获取std::string,那么使用它是否安全c_str?例如,如果我在析构函数中并且我想将一些数据从一个复制string到预先分配的固定大小的缓冲区中,我可以使用c_str并确保它不会抛出任何东西吗?

c++ string

11
推荐指数
2
解决办法
813
查看次数

标签 统计

c++ ×6

string ×4

aggregate ×1

c++-faq ×1

c++03 ×1

c++11 ×1

c++17 ×1

cstring ×1

standard-layout ×1

standards ×1

std ×1

stl ×1

types ×1

winapi ×1