标签: std

比较 std::string_view 和子字符串 string_view

假设我们有一个 string_view 和另一个 string_view,它是第一个 string_view 的子集:

using namespace std; // just to shorten the example...

string_view s{"abc def"};
auto t = s.substr(4);
auto u = s.substr(0, 4);

cout << *(s.begin() + 4) << "  " << *t.begin() << '\n';
cout << ((s.begin() + 4) == t.begin());
cout << (s.end() == t.end());
cout << ((s.begin() +5) == t.begin());
cout << ((s.begin() +5) == (t.begin() + 1));
cout << ((s.begin() + 4) == u.end()); // true
Run Code Online (Sandbox Code Playgroud)

所有比较都可以在 gcc (9 HEAD) 和 clang …

c++ std string-view c++17

0
推荐指数
1
解决办法
2737
查看次数

如何获取元组中的成员数

如何获取元组中元素的数量。这样我就可以做下面的事情。

for(int i=0;i<tuple.count();++i)
    cout << std::get<i>(tuple) << endl;
Run Code Online (Sandbox Code Playgroud)

编辑:我的问题是元组大小,而不是迭代它的成员。那是另一个话题了。所以核心点是获取元组大小。迭代是额外的。所以它与您提到的问题不重复。

c++ std

0
推荐指数
1
解决办法
1811
查看次数

if 语句中的 std::bind C++

我正在为一个学校项目处理一些遗留代码,并尝试捕获 std::bind 是否失败。这是项目中当前的代码(不是我写的),它在 VS 2019 中产生“C++ 没有运算符匹配这些操作数”错误。我尝试与 bool 进行比较,这就是它所说的 std::bind 返回到 no有用。

if ( bind( socket, (const sockaddr*) &address, sizeof(sockaddr_in) ) < 0 )
{
    printf( "failed to bind socket\n" );
    Close();
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果 std::bind 在 if 语句中失败,我还能如何正确捕获?

c++ std

0
推荐指数
1
解决办法
358
查看次数

std::greater 位于 double 和 class 的 std::pair 上

std::greater当你有课std::pair的时候有用吗int

我正在尝试创建一个成对的优先级队列,按第一个元素排序:

std::priority_queue<std::pair<double, classA>, std::vector<std::pair<double, classA>>, std::greater<std::pair<double, classA>>> priorityQueue
Run Code Online (Sandbox Code Playgroud)

但我收到一条错误消息

与“运算符<”不匹配

它暗示了 的第二个元素std::pair,它是类类型。

应用于std::greater第一个和第二个元素std::pair

c++ std priority-queue min-heap std-pair

0
推荐指数
1
解决办法
2618
查看次数

当字符串中间有空值时将 std::string 转换为 char*

char* convert()
{    
    std::string data = "stack\0over\0flow";
    return data.c_str();
}
Run Code Online (Sandbox Code Playgroud)

这将返回指针,并且在调用者上从它构建字符串时,它将具有堆栈而不是完整的字符串。在 C++ 11 中是否有解决方法,无需更改输入和返回类型?我想从 char* 重建调用方的整个字符串。

c++ string std

0
推荐指数
1
解决办法
499
查看次数

std:atomic 使用引用初始化会创建基础变量的副本吗?

让我们考虑下一个片段:

int val=5;
int& ref=val;
std::atomic<int> atomicref(ref);

++atomicref;
std::cout<< "atomic ref="<<atomicref.load()<<" original ref="<<ref<<" original val="<<val;
Run Code Online (Sandbox Code Playgroud)

当我在 Mac OS X、XCode 8.3.3、c++11 下编译它时,我收到如下输出:

atomic ref=6 original ref=5 original val=5
Run Code Online (Sandbox Code Playgroud)

该行:

std::atomic<int> atomicref(ref);

当然看起来很可疑,因为原子下的类型与变量声明中的类型不同 - 它是引用。

我想知道为什么这些值不匹配;说atomicref实际上创建了val的副本是否正确?

c++ macos std c++11 stdatomic

0
推荐指数
1
解决办法
408
查看次数

具有重载 less 运算符的 std::max 无法编译

这是代码:

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <utility>

struct student
{
    std::string full_name;
    int group;
    int number;

    friend std::istream& operator>>(std::istream& in, student& obj)
    {
        in >> obj.full_name >> obj.group >> obj.number;
        return in;
    }
    friend std::ostream& operator<<(std::ostream& out, const student& obj)
    {
        out << "Full name: " << obj.full_name << '\n';
        out << "Group: " << obj.group << '\n';
        out << "Number: " << obj.number << '\n';
        return out;
    }

    bool operator<(const student& obj)
    {
        return this->number …
Run Code Online (Sandbox Code Playgroud)

c++ overloading operator-overloading std max

0
推荐指数
1
解决办法
206
查看次数

是否允许使用新定义扩展 std::numbers 命名空间?

我在大型代码库中定义了几个数学数字常量。其中几个(但不是全部)现在在新的 C++20<numbers>标头中重复。我想把它们都集中在一处;是否允许扩展std::numbers标头以包含尚未定义的标头?

c++ namespaces std c++20

0
推荐指数
1
解决办法
196
查看次数

如何在堆上分配 std::array ?

在堆上分配 std::array 时遇到一些麻烦。

\n

这是我尝试过的:

\n
std::array<int,3> *arr1; \narr1 = new std::array<int,3>;\narr1[0] = 1;\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我得到的错误是:

\n

错误:与 \xe2\x80\x98operator*\xe2\x80\x99 不匹配(操作数类型为 \xe2\x80\x98std::array\xe2\x80\x99)。

\n

我也尝试过:

\n
arr1[0][0] = 1;\n
Run Code Online (Sandbox Code Playgroud)\n

这有效,但也有效:

\n
arr1[5][5] = 2;\n
Run Code Online (Sandbox Code Playgroud)\n

这不应该工作,因为 std::array<int, 3> 指示数组大小应该只有 3 个整数。

\n

我在这里做错了什么?

\n

c++ arrays dynamic std heap-memory

0
推荐指数
1
解决办法
1248
查看次数

std::vector.data() 在指针向量上是否以 null 终止?

我在我的 C++ 应用程序中使用 C 库。其中一项功能需要一个null-terminated array of pointers.

由于我使用的是 C++,因此我将数组的元素存储在std::vector.

data()我想知道简单地调用我的向量并将结果传递给库函数是否安全。

示例:

std::vector<struct A *> vec;

//library_function(struct A **array);
library_function(vec.data());
Run Code Online (Sandbox Code Playgroud)

当然,如果我更改向量中的元素,则返回的指针data()将无效,但这不是这里的问题(我可以在更新向量时再次调用该函数)。

我只是担心这可能是未定义的行为,因为我看不到任何提到的data()由空指针而不是随机垃圾终止的地方。

标准确实说:

const T* data() const noexcept;

Returns pointer to the underlying array serving as element storage.
The pointer is such that range [data(); data() + size()) is always a valid range
Run Code Online (Sandbox Code Playgroud)

因此存在一个终止元素,但它没有说明该元素是否已初始化以及如果已初始化,则具有什么值。

是否在其他地方指定了我错过的?
或者我是否必须自己分配一个原始数组并以 null 终止它?

c++ std stdvector undefined-behavior

0
推荐指数
1
解决办法
728
查看次数