我有一个for循环,我做的是这个.
forloop ( loop 7000 times)
{
x += 2000_char_long_string;
}
Run Code Online (Sandbox Code Playgroud)
代码在这个forloop中持续很长时间,可能超过1分钟.我怎么解决这个问题?
谢谢.
我们有这个代码:
Test1 t1;
Test2 t2;
t1 = t2;
Run Code Online (Sandbox Code Playgroud)
我相信有三种(或更多?)方法如何实施 t1 = t2
Test1Test2Test1(const Test2&)转换构造函数根据我的GCC测试,这是使用的优先级:
请帮我理解为什么这个优先.
我使用此代码进行测试(取消注释某些行以试用)
struct Test2;
struct Test1 {
Test1() { }
Test1(const Test2& t) { puts("const constructor wins"); }
// Test1(Test2& t) { puts("constructor wins"); }
// Test1& operator=(Test2& t) { puts("assign wins"); }
};
struct Test2 {
Test2() { }
// operator Test1() const { puts("const cast wins"); return Test1(); }
// operator Test1() { puts("cast …Run Code Online (Sandbox Code Playgroud) 我总是新手到C++世界(也是C).而且不知道它的所有细节.但有一件事让我感到困扰.它是如下构造:
while (a=b) {...}.我理解这种魔法是有效的,因为C和C++中的赋值运算符返回了一些东西.所以问题是:它返回了什么?这是一个记录在案的东西吗?它在C和C++中的作用是否相同.关于赋值运算符及其在C和C++中的实现的低级细节(如果存在差异)将非常感激!
我希望这个问题不会被关闭,因为从低层次的角度来看,我无法找到关于这个主题的全面解释和好材料.
代码如下:
#include <iostream>
using namespace std;
class A {
};
A rtByValue() {
return A();
}
void passByRef(A &aRef) {
// do nothing
}
int main() {
A aa;
rtByValue() = aa; // compile without errors
passByRef(rtByValue()); // compile with error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g ++编译器给出以下错误:
d.cpp: In function ‘int main()’:
d.cpp:19:23: error: invalid initialization of non-const reference of type ‘A&’ from an rvalue of type ‘A’
d.cpp:12:6: error: in passing argument 1 of ‘void passByRef(A&)’
Run Code Online (Sandbox Code Playgroud)
它说我不能将rvalue作为非const引用的参数传递,但是我很困惑的是为什么我可以分配给这个rvalue,就像代码所示.
比如,它让我困惑:
struct A {
// some fileds...
char buf[SIZE];
};
A a;
a = a;
Run Code Online (Sandbox Code Playgroud)
通过A的字段buf,看起来默认的赋值操作可能会调用类似于memcpy将对象X分配给Y的东西,所以如果将对象分配给自身并且没有定义明确的赋值操作,a = a;如上所述.
memcpy手册页:
DESCRIPTION
The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas must not overlap. Use memmove(3) if the memory areas do overlap.
Run Code Online (Sandbox Code Playgroud)
如果使用memcpy,可能会发生一些未定义的行为.
那么,C++对象中的默认赋值操作行为是什么?
在C++ 11之前,一直都是复制赋值运算符应该总是通过const引用传递的情况,如下所示:
template <typename T>
ArrayStack<T>& operator= (const ArrayStack& other);
Run Code Online (Sandbox Code Playgroud)
但是,随着移动赋值运算符和构造函数的引入,似乎有些人主张使用pass by value进行复制赋值.还需要添加移动赋值运算符:
template <typename T>
ArrayStack<T>& operator= (ArrayStack other);
ArrayStack<T>& operator= (ArrayStack&& other);
Run Code Online (Sandbox Code Playgroud)
上面的2个运算符实现如下所示:
template <typename T>
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack other)
{
ArrayStack tmp(other);
swap(*this, tmp);
return *this;
}
template <typename T>
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack&& other)
{
swap(*this, other);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
在为C++ 11开始创建复制赋值运算符时,使用pass by值是一个好主意吗?我应该在什么情况下这样做?
## generate data for medical example
clinical.trial <-
data.frame(patient = 1:100,
age = rnorm(100, mean = 60, sd = 6),
treatment = gl(2, 50,
labels = c("Treatment", "Control")),
center = sample(paste("Center", LETTERS[1:5]), 100, replace =
TRUE))
## set some ages to NA (missing)
is.na(clinical.trial$age) <- sample(1:100, 20)
Run Code Online (Sandbox Code Playgroud)
我无法理解这最后一行.LHS是所有FALSE值的向量.RHS是从载体1:100中选择的20个数的向量.我不明白这种任务.这是如何clinical.trial$age获得一些NA价值的?这种作业有名字吗?充其量我会说RHS上的布尔向量通过回收获得分配给它的数字.
被std::map拷贝赋值(风格map1 = map2;)需要复制的比较map2来map1?
我已经测试了实际的实现.我更感兴趣的是它在C++标准中的位置.
这是我的Python代码,它创建了一个无限嵌套的字典:
a = a['k'] = {}
print(a)
print(a['k'])
print(a['k']['k'])
print(a is a['k'])
Run Code Online (Sandbox Code Playgroud)
这是输出:
{'k': {...}}
{'k': {...}}
{'k': {...}}
True
Run Code Online (Sandbox Code Playgroud)
输出显示a['k']引用a自身,使其无限嵌套.
我猜这句话:
a = a['k'] = {}
Run Code Online (Sandbox Code Playgroud)
表现得像:
new = {}
a = new
a['k'] = new
Run Code Online (Sandbox Code Playgroud)
这确实会创建一个无限嵌套的字典.
我查看了第7.2节:Python语言参考的赋值语句,但我找不到任何暗示a = a['k'] = {}应首先设置a为新字典然后在该字典中插入键/值对的内容.以下是我发现相关但没有回答我的问题的参考摘录:
如果目标列表是没有尾随逗号的单个目标,可选择在括号中,则将该对象分配给该目标.
如果目标是订阅:将评估引用中的主表达式.它应该产生可变序列对象(例如列表)或映射对象(例如字典).接下来,评估下标表达式.
如果primary是映射对象(例如字典),则下标必须具有与映射的键类型兼容的类型,然后要求映射创建将下标映射到指定对象的键/数据对.这可以用相同的键值替换现有的键/值对,或者插入新的键/值对(如果不存在具有相同值的键).
这些摘录中的每一个都定义了具有单个目标的任务的行为,例如a = {},a['k'] = {}但是他们似乎并没有谈论在情况下会发生什么a = a['k'] = {}.记录此类声明的评估顺序在哪里?
python dictionary reference operator-precedence assignment-operator