标签: assignment-operator

C#+ =(加上等于)(加法分配)工作非常慢,当字符串太长时?

我有一个for循环,我做的是这个.

forloop ( loop 7000 times)
{
x += 2000_char_long_string;
}
Run Code Online (Sandbox Code Playgroud)

代码在这个forloop中持续很长时间,可能超过1分钟.我怎么解决这个问题?

谢谢.

c# string performance assignment-operator

8
推荐指数
2
解决办法
7296
查看次数

为什么我要将复制构造函数和赋值运算符设为私有并在C++中实现?

灵感来自这个问题.

通常,创建复制构造函数和赋值运算符的原因private使类不可复制,以便只能创建和销毁对象,但不能复制 - 大多数情况下,因为复制它们没有任何意义.在这种情况下,复制构造函数和赋值运算符都已生成private 且未实现 - 如果类不可复制,则无人应复制.

复制构造函数和赋值运算符是否需要private同时具有有意义的实现?

c++ copy-constructor assignment-operator

8
推荐指数
3
解决办法
4011
查看次数

c ++:cast运算符与assign运算符与转换构造函数优先级

我们有这个代码:

Test1 t1;
Test2 t2;
t1 = t2;
Run Code Online (Sandbox Code Playgroud)

我相信有三种(或更多?)方法如何实施 t1 = t2

  • 过载赋值运算符 Test1
  • 重载类型转换操作符 Test2
  • 创建Test1(const Test2&)转换构造函数

根据我的GCC测试,这是使用的优先级:

  1. 分配运营商
  2. 转换构造函数和类型转换运算符(不明确)
  3. const转换构造函数和const类型转换运算符(不明确)

请帮我理解为什么这个优先.

我使用此代码进行测试(取消注释某些行以试用)

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++ casting copy-constructor assignment-operator

8
推荐指数
1
解决办法
4004
查看次数

C/C++赋值运算符实现的低级细节.它返回了什么?

我总是新手到C++世界(也是C).而且不知道它的所有细节.但有一件事让我感到困扰.它是如下构造: while (a=b) {...}.我理解这种魔法是有效的,因为C和C++中的赋值运算符返回了一些东西.所以问题是:它返回了什么?这是一个记录在案的东西吗?它在C和C++中的作用是否相同.关于赋值运算符及其在C和C++中的实现的低级细节(如果存在差异)将非常感激!

我希望这个问题不会被关闭,因为从低层次的角度来看,我无法找到关于这个主题的全面解释和好材料.

c c++ assignment-operator

8
推荐指数
2
解决办法
8432
查看次数

C++函数返回一个rvalue,但是可以为其赋值?

代码如下:

 #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,就像代码所示.

c++ temporary rvalue assignment-operator

8
推荐指数
1
解决办法
1165
查看次数

什么是c ++的默认分配操作行为?

比如,它让我困惑:

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++ assignment-operator

8
推荐指数
1
解决办法
2589
查看次数

复制赋值运算符应该通过const引用还是按值传递?

在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值是一个好主意吗?我应该在什么情况下这样做?

c++ assignment-operator move-semantics c++11

8
推荐指数
1
解决办法
741
查看次数

分配给is.na(clinical.trial $ age)

我正在查看这里的代码,它在开头有这个:

## 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上的布尔向量通过回收获得分配给它的数字.

r assignment-operator

8
推荐指数
1
解决办法
151
查看次数

std :: map是否分配了它的比较器?

std::map拷贝赋值(风格map1 = map2;)需要复制的比较map2map1

我已经测试了实际的实现.我更感兴趣的是它在C++标准中的位置.

c++ dictionary assignment-operator language-lawyer

8
推荐指数
1
解决办法
165
查看次数

为什么a = a ['k'] = {}创建一个无限嵌套的字典?

这是我的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

8
推荐指数
1
解决办法
182
查看次数