我正在学习C++,我遇到了这个函数的问题.我最初传递了整个向量,然后传递了一个指向向量的指针; 但我似乎无法从指向矢量的指针赋值.
void fill(std::vector<int> *vec, const int startVal)
{
const int n = vec->size();
for (int i = 0; i < n; ++i)
{
vec[i] = startVal + i
}
}
Run Code Online (Sandbox Code Playgroud)
如何在指针(vec)的第i个位置为向量分配值?
我试过了:
vec->[i] = startVal + i;
Run Code Online (Sandbox Code Playgroud) 我有私有变量std::vector<some struct>可以我以某种方式将向量传递给函数返回值,但没有"写"访问权限,因此您将无法向其中添加新元素,并且您将无法修改元素(例如const std::vector<some const struct>*,我怎么能这样做?我唯一的想法就是创建一个带有常量指针的新向量.有更好的解决方案吗?
有没有办法禁用operator =和复制构造函数,并允许std::move()只使用?我知道我能做到
foo& operator= (const foo&) = delete;
foo(const foo&) = delete;
Run Code Online (Sandbox Code Playgroud)
但这也会禁用std :: move.
我想要的是阻止复制此类
并仅允许foo foo2 = std::move(foo1);
顺便说一句.我有私人构造.
我已经测量了以下代码的执行时间:
volatile int r = 768;
r -= 511;
volatile int r = 768;
r = (r & ~512) + 1;
Run Code Online (Sandbox Code Playgroud)
部件:
mov eax, DWORD PTR [rbp-4]
sub eax, 511
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-4]
and ah, 253
add eax, 1
mov DWORD PTR [rbp-4], eax
Run Code Online (Sandbox Code Playgroud)
结果:
Subtraction time: 141ns
AND + addition: 53ns
Run Code Online (Sandbox Code Playgroud)
我已经多次运行代码片段并且结果一致.
有人可以解释一下,为什么会出现这种情况,甚至还有一个AND +添加版本的组装线?
我组建了一个小类,继承自std::enable_shared_form_this如下:
class Foo : std::enable_shared_from_this<Foo>
{
Foo() = default();
public:
[[nodiscard]] static auto getInstance()
{
static auto f = std::shared_ptr<Foo>(new Foo());
return f;
}
stream construct()
{
return stream{ shared_from_this() };
}
};
Run Code Online (Sandbox Code Playgroud)
每当我打电话时construct(),bad_weak_ptr exception都会被抛出。谁能解释为什么我会观察到这种行为?
编译:Apple clang 版本 13.0.0 (clang-1300.0.29.30)
目标:arm64-apple-darwin21.5.0
我有以下代码:
size_t lufread(void *ptr,size_t size,size_t n,LUFILE *stream)
{
unsigned int toread = (unsigned int)(size*n);
if (stream->is_handle)
{
DWORD red;
BOOL res = ReadFile(stream->h,ptr,toread,&red,NULL);
if (!res)
stream->herr=true;
return red/size;
}
if (stream->pos+toread > stream->len)
toread = stream->len-stream->pos;
memcpy(ptr, (char*)stream->buf + stream->pos, toread);
DWORD red = toread;
stream->pos += red;
return red/size;
}
Run Code Online (Sandbox Code Playgroud)
这是编译器错误:
error C2664: 'ReadFile' : cannot convert parameter 4 from 'unsigned int *' to 'LPDWORD'
Run Code Online (Sandbox Code Playgroud)
我不明白,因为DWORD red是相同unsigned long red
所以在函数ReadFile()第四个参数&red应该是unsigned long …
嘿,所以我对 C++ 相当陌生,我遇到了这个问题,我想将一个字符串的 std 列表拆分为两个列表。
例如:list(1,2,3,4)->list1(1,2) & list2(3,4)
我想splice这就是我应该使用的,但我根本不明白它是如何工作的......
有人可以建议我如何做到这一点吗?
抱歉我的英语不好,感谢大家的帮助。