C++备忘录100:std::ssize终于来了

C++的经典问题

#include <iostream>

int main() {
    int a = -1;
    unsigned b = 1;
    std::cout << (a > b ? "-1 > 1" : ""); // prints -1 > 1
}

因为继承自C的整型转换规则,宽度相同的整数,有符号数被转换成无符号数,所以-1 > 1。这是不同符号数运算始终存在的风险

为了避免这种问题,除了位运算之类的特殊操作,一切整型都应该使用有符号数。而且从效率的角度来说,有符号数比无符号数效率更高(因为未定义行为)

但是,由于历史原因,STL中size()返回的是无符号数,于是造成了一堆丑陋的static_cast

C++20中,终于有了std::ssize()返回有符号数的大小。但是缺点是,如果写模版的话,应该包含那个头文件呢?

Defined in header <array>
Defined in header <deque>
Defined in header <forward_list>
Defined in header <iterator>
Defined in header <list>
Defined in header <map>
Defined in header <regex>
Defined in header <set>
Defined in header <span>
Defined in header <string>
Defined in header <string_view>
Defined in header <unordered_map>
Defined in header <unordered_set>
Defined in header <vector>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!您可以通过以下步骤将`std::vector<cv::Vec6f>`数组通过socket进行传输: 1. 首先,将`std::vector<cv::Vec6f>`数组转换为字符数组或字节流。您可以使用`reinterpret_cast`将`std::vector<cv::Vec6f>`转换为`char`指针,并计算出需要传输的字节数。 ```cpp std::vector<cv::Vec6f> data; // 假设这是您要传输的数组 // 将vector转换为char指针 char* dataPtr = reinterpret_cast<char*>(data.data()); // 计算需要传输的字节数 size_t dataSize = data.size() * sizeof(cv::Vec6f); ``` 2. 创建一个socket连接,并确保连接到正确的目标主机和端口。 ```cpp #include <sys/socket.h> #include <arpa/inet.h> int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serverAddress; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(PORT); // 设置目标端口 inet_pton(AF_INET, SERVER_IP, &(serverAddress.sin_addr)); // 设置目标IP connect(sock, (struct sockaddr*)&serverAddress, sizeof(serverAddress)); ``` 3. 使用`send`函数将数据发送到目标主机。 ```cpp size_t totalBytesSent = 0; while (totalBytesSent < dataSize) { ssize_t bytesSent = send(sock, dataPtr + totalBytesSent, dataSize - totalBytesSent, 0); if (bytesSent == -1) { // 发送失败处理 break; } totalBytesSent += bytesSent; } ``` 4. 在接收端,使用相同的逻辑接收数据,并将接收到的字节流转换回`std::vector<cv::Vec6f>`。 ```cpp std::vector<cv::Vec6f> receivedData(dataSize / sizeof(cv::Vec6f)); size_t totalBytesReceived = 0; while (totalBytesReceived < dataSize) { ssize_t bytesReceived = recv(sock, receivedData.data() + totalBytesReceived, dataSize - totalBytesReceived, 0); if (bytesReceived <= 0) { // 接收失败处理 break; } totalBytesReceived += bytesReceived; } ``` 请注意,上述示例代码仅提供了一个基本的框架,您可能需要根据您的实际情况进行适当的修改和错误处理。此外,确保在接收端对接收到的数据进行正确的类型转换和处理。 希望对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值