问题描述
边缘类:
<ipython-input-14-82df91b172c5> in <module>
1 for column in original_data:
----> 2 original_data['alert'] = np.where(((original_data[original_data.columns[column]] >= original_data[original_data.columns[column+'_ma']]) or (original_data[original_data.columns[column]] <= original_data[original_data.columns[column+'_ma']])),'T','F')
3
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in __getitem__(self,key)
3928 if is_scalar(key):
3929 key = com.cast_scalar_indexer(key)
-> 3930 return getitem(key)
3931
3932 if isinstance(key,slice):
IndexError: only integers,slices (`:`),ellipsis (`...`),numpy.newaxis (`None`) and integer or boolean arrays are valid indices
在ctor class Edge {
int dist = 0;
std::pair<Node,Node> ends;
public:
Edge() = default;
explicit Edge(const int idist) : dist(idist) { }
explicit Edge(const int idist,Node& end1,Node& end2) : dist(idist) {
ends.first = end1;
ends.second = end2;
}
~Edge() = default;
};
中,为什么不允许使用该语法?:
explicit Edge(const int idist,Node& end2)
解决方法
这是不允许的。作为member initializer list的语法,
class-or-identifier ( expression-list(optional) ) (1) class-or-identifier brace-init-list (2) (since C++11)
尽管ends.first
和ends.second
没有引用类或标识符,但它们是表达式。您必须全部初始化ends
,例如
explicit Edge(const int idist,Node& end1,Node& end2) : dist(idist),ends(end1,end2) { }
,
允许您尝试执行的操作,但是您执行操作的方法是不允许的。
初始化程序列表指定如何将包含未初始化字节的内存的随机位转换为有效对象。然后,构造函数可以使用此新对象执行操作,但是对象状态需要事先进行初始化。对于默认初始化导致的未初始化值的一些警告,但是在初始化列表中唯一有效的事情是调用成员的构造函数。 ({See here有关默认初始化的更多信息。)
在您的情况下,first
和second
是pair
的字段。您必须先构建一对,然后才能访问它们。即使那样,您也不一定可以按照您尝试的方式重新初始化它们。
解决方案是使用其构造函数之一立即初始化整个对:
explicit Edge(const int idist,end2) { }
,
C ++类的基本特征之一是,每个对象(不存在恶意对象)都将由其构造函数正确创建。从另一个角度看,如果一个类型具有构造函数,那么您必须使用构造函数创建该类型的对象。
在Edge
的构造方法初始值设定项列表中,Edge
的每个成员都将被构造。由于std::pair
有其自己的构造函数,因此构造Edge
对象意味着使用ends
的适当构造函数构造该std::pair
成员。
这不是您应该尝试绕过的东西。这是声音编程的基础。构造函数创建对象。自己做的事情有创建未正确创建的事情的风险。是的,在这种情况下,您可能可以摆脱它。但是,绕过构造函数没有任何好处,在其他情况下,这将导致严重的问题。不要绕过构造函数。让他们去做他们的工作,这样您的工作就会容易得多。