有这个代码:
auto sym_draw = [&](u32 ch)
{
//...
};
u32string tmp;
utf8::utf8to32(text.begin(), text.end(), back_inserter(tmp));
for (auto ch : tmp)
{
sym_draw(ch);
}
一切都会好的,但不需要 tmp 行,只需要字符本身。
如何从 std 替换插入器,以便字符直接进入 lambda?
有这个代码:
auto sym_draw = [&](u32 ch)
{
//...
};
u32string tmp;
utf8::utf8to32(text.begin(), text.end(), back_inserter(tmp));
for (auto ch : tmp)
{
sym_draw(ch);
}
一切都会好的,但不需要 tmp 行,只需要字符本身。
如何从 std 替换插入器,以便字符直接进入 lambda?
我想为 JSON 做一个解析器。
using JsonData = std::variant<vector<JsonData>, std::unordered_map<string, JsonData>, double, bool, string>;
但他不是那样吃的。
你怎么能让他吃那个?联合本身写起来不安全吗?
(uint64_t)1 << (size- (size - 1) / 64*64) 1 unsigned __int64
((uint64_t)1 <<64) 0 unsigned __int64
(size- (size - 1) / 64*64) 64 int
int size=128;
为什么第一个表达式不是 0?
视觉 C++ 2017
您如何执行 + 并获得溢出?为此做某种条件构造很奇怪。处理器有一个溢出标志。
例如,一般情况下,您需要添加 2 个 2048 位的数字。
理论上这是一个addc命令,但是在c++中怎么做呢?
int64_t *data;
uint size;
让号码像这样存储。但是怎么处理这个标志呢?存放在最左边还是分开存放?做乘法除法加法的最佳方法是什么?
#include <cstdio>
#include <iostream>
#include <fstream>
#include <thread>
using namespace std;
void fwriter(fstream &f) {
f << " write ok"<<endl;
}
int main()
{
fstream f;
f.open("log.txt", fstream::in | fstream::out | fstream::app);
thread th;
th = thread(fwriter, ref(f));
cout<<th.get_id()<<endl;
th.join();
cout<<th.get_id()<<endl;
cout << "OK" << endl;
getchar();
return 0;
}
因此,这里这样的程序是不执行join后的流程。
thread::id of a non-executing thread
之后线程是否释放了所有资源?你需要做点别的th.swap(thread());
吗?
我有一个带有此声明的 3D 数组:
unordered_map<int, unordered_map<int, unordered_map<int, T*>>> &ll=data[0];
如何创建、删除、检查其中的存在、遍历整个阵列?我知道几种方法,但它们有 100 行长而且效率很低。
我有一个服务器程序。我可以在所有 3 个 ip 上连接到它:
127.0.0.1
本地
192.168.1.3
路由器
109.127.85.64
互联网
我只能使UDP工作。
如何在网络上找到我的IP地址?(程序需要它,我可以在2ip上找到)。可以通过任何资源吗?或者一些特殊的功能。需要Linux。
我写了 2 个简单的 udp 类(通过削减一些服务器和客户端代码)。
#include "usefull.h"
#include <winsock2.h>
#include <Ws2tcpip.h>
#pragma comment (lib, "Ws2_32.lib")
class IADDR
{
public:
sockaddr_in addr;
IADDR()
{
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
}
IADDR(string ip,int16_t port)
{
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
char buff1[100];
InetPton(AF_INET, ip.c_str(), &addr.sin_addr.s_addr);
addr.sin_port = htons(port);
//addr.sin_addr.s_addr = htonl(addr.sin_addr.s_addr);
}
};
class UDP
{
public:
UDP()
{
ok = 0;
if (!is_st)
{
WSADATA w;
int res = WSAStartup(MAKEWORD(2, 2), &w);
if (res != 0)
{
return;
}
is_st = 1;
}
}
~UDP()
{
if (ok == 1)
{
closesocket(sock);
ok = 0;
}
}
void set(IADDR a)
{
if (ok == 1)
{
closesocket(sock);
ok = 0;
}
if (is_st == 0)
return;
addr = a;
sock = socket(AF_INET, SOCK_DGRAM, 0);
u_long nMode = 1;
if (ioctlsocket(sock, FIONBIO, &nMode) == SOCKET_ERROR)
{
closesocket(sock);
}
ok = 1;
}
void send(vector<byte> v)
{
send(&v[0], v.size());
}
void send(const byte* buff, uint32_t size)
{
if (ok == 0)
return;
int len = sizeof(addr.addr);
sendto(sock, (char*)buff, size, 0, (sockaddr*)&addr.addr, len);
}
bool recv(vector<byte> &data)
{
if (ok == 0)
return 0;
data.resize(1024);
sockaddr_in serverInfo;
int fromlen = sizeof(addr.addr);
uint len = recvfrom(sock, (char*)&data[0], 1024, 0, (sockaddr*)&serverInfo, &fromlen);
if (len != SOCKET_ERROR)
{
data.resize(len);
return 1;
}
else
{
data.resize(0);
return 0;
}
}
private:
int sock;
IADDR addr;
int ok;
static int is_st;
friend class UDPSERVER;
};
class UDPSERVER
{
public:
UDPSERVER()
{
ok = 0;
if (!UDP::is_st)
{
WSADATA w;
int res = WSAStartup(MAKEWORD(2, 2), &w);
if (res != 0)
{
return;
}
UDP::is_st = 1;
}
}
~UDPSERVER()
{
if (ok == 1)
{
closesocket(sock);
ok = 0;
}
}
void set(USHORT port)
{
if (UDP::is_st == 0)
return;
if (ok == 1)
{
closesocket(sock);
ok = 0;
}
struct sockaddr_in sv_ip;
sv_ip.sin_family = AF_INET;
sv_ip.sin_port = htons(port);
sv_ip.sin_addr.s_addr = INADDR_ANY;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET)
{
return;
}
u_long nMode = 1;
if (ioctlsocket(sock, FIONBIO, &nMode) == SOCKET_ERROR)
{
closesocket(sock);
return;
}
if (bind(sock, (sockaddr*)&sv_ip, sizeof(sv_ip)) == SOCKET_ERROR)
{
closesocket(sock);
return;
}
ok = 1;
}
void send(vector<byte> v, IADDR &a)
{
send(&v[0], v.size(), a);
}
void send(const byte* buff, uint32_t size, IADDR &a)
{
if (ok == 0)
return;
int fromlen = sizeof(a.addr);
sendto(sock, (char*)buff, size, 0, (sockaddr*)&a.addr, fromlen);
}
bool recv(vector<byte> &data, IADDR &a)
{
if (ok == 0)
return 0;
data.resize(1024);
int fromlen = sizeof(a.addr);
int len = recvfrom(sock, (char*)&data[0], 1024, 0, (sockaddr*)&a.addr, &fromlen);
if (len != SOCKET_ERROR)
{
data.resize(len);
return 1;
}
else
{
data.resize(0);
return 0;
}
}
private:
SOCKET sock;
IADDR addr;
int ok;
};
int UDP::is_st = 0;
我对套接字一无所知。它似乎工作正常,但它会崩溃吗?并且有必要以某种方式将其转移到 Linux,但是如何?使用 boost 是不可接受的!(因为安装需要 2 小时,甚至不是 1 次)。也不应该使用 QT。他有执照。
Win 编译 VS 和 Linux QTCreator。
我什至没有尝试在 Linux 下编译。显然在Windows下。
我想以 2 个简单类的形式在套接字上创建一个包装器。类似于 QTUdp。 http://doc.qt.io/qt-5/qudpsocket.html
但为了创建它,我需要一个有效的 udp 客户端和服务器代码。谁想到了工作代码(通过 std::..... 更好) UPD:我需要 ASYNCHRONOUS 输入输出。
自 90 年代以来我发现的甚至没有编译。我希望代码也能在 Linux 上运行。使用 boost 是不可接受的!(因为安装需要 2 小时,甚至不是 1 次)。
Win 编译 VS 和 Linux QTCreator。