C++啥情况下使用PYTHON辅助
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++啥情况下使用PYTHON辅助相关的知识,希望对你有一定的参考价值。
参考技术A 程序有两种执行方式,解释执行和编译执行。PYTHON是一种脚本语言,是解释执行的,不需要经过编译,所以很方便快捷,且能够很好地跨平台,写一些小工具小程序特别合适。
而C++则是一种需要编译后运行语言,在特定的机器上编译后在特定的机上运行,运行效率高,安全稳定。但编译后的程序一般是不跨平台的。
学习一种编程语言不能看它热不热。而是要看它在某个领域的作用。就像汇编,虽然现在不热了,但是它在某些行业内还是很吃香的。PYTHON确实很强大,但在三五年内,不会作为一种主流的编程语言。至少在Windows程序开发领域内不会。
建议将C++作为主要的学习方向,将PYTHON作为一种辅助工具。当然,都能学通则更好了。
c++中以下两种向量使用情况有啥区别?
【中文标题】c++中以下两种向量使用情况有啥区别?【英文标题】:What is the difference in the following two cases of vector usage in c++?c++中以下两种向量使用情况有什么区别? 【发布时间】:2016-08-31 16:15:00 【问题描述】:案例一:
std::vector< Ticker > snap_tickers_ (n_instruments);
和 案例2:
std::vector< Ticker >snap_tickers_;
snap_tickers_.resize(n_instruments);
我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关?
回答: 在案例 2 中调整大小使用复制构造函数,该构造函数已为 Ticker 类删除,因此失败。
【问题讨论】:
reference material 会回答这个问题 内森,我查看了引用的材料,找不到答案.. @Appy 这些语句之间没有太大区别。第一个定义构造函数中的初始大小,而第二个通过单独调用resize()
来实现。实际上很难相信您无法从链接的参考文档中弄清楚这一点。
@πάνταῥε ῖ我试图指出我在这两种情况下找不到任何区别。我认为它们是相同的,问题是我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关?
@Appy 确定它的最佳方法是将Ticker
替换为一些琐碎的东西,例如int
,然后查看它是否仍然可以编译(忽略以后对向量的其他预期Ticker
的使用)。此外,这将有助于在问题中包含您的错误
【参考方案1】:
没有真正的区别。 案例一:
std::vector<int> vec(5);
分配 5 个 int 元素。
案例2:
std::vector<int> vec;
vec.resize(5);
在这里,我们从一个空的整数向量开始。 然后,当您调用 resize 时,该函数会检查您传递的大小是否小于实际大小(在这种情况下为 0)。如果是,分配 _Newsize - size() 新元素。如果没有,pop_back(删除)size() - _Newsize 个元素。
所以最后,resize 会更慢,因为有更多的机器周期(if 语句,减去大小...)要做。
如果你现在想要更多,这里是矢量的调整大小函数:
void resize(size_type _Newsize)
// determine new length, padding as needed
if (_Newsize < size())
_Pop_back_n(size() - _Newsize);
else if (size() < _Newsize)
// pad as needed
_Alty _Alval(this->_Getal());
_Reserve(_Newsize - size());
_TRY_BEGIN
_Uninitialized_default_fill_n(this->_Mylast, _Newsize - size(),
_Alval);
_CATCH_ALL
_Tidy();
_RERAISE;
_CATCH_END
this->_Mylast += _Newsize - size();
如您所见,它做了很多事情。 但最后,这只是一个关于(在大多数情况下并不重要)微秒的问题...... 所以没有真正的区别。
【讨论】:
我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关? mh。我不知道为什么你会得到一个错误。这真是太奇怪了。必须来自 Ticker 类。如果那是您的课程,请查看 = 运算符是否重载。它应该是!如果不是这样,在使用算法时可能会造成一些麻烦。 是的,我已经用删除操作重载了 '=' 运算符,如本答案中所述以禁止复制:***.com/a/5513928/5330679 好的,我尝试创建一个类,并为其创建一个向量,然后调整它的大小。我不得不移除 dekonstruktor 并且它起作用了。也许试试看。 当我删除 = 运算符和 A(const A &other) 时它也有效【参考方案2】:根据 C++ 标准(自 C++03 起),std::vector
需要连续存储所有元素,
[...] 这意味着不仅可以通过迭代器访问元素,还可以在指向元素的常规指针上使用偏移量。这意味着指向向量元素的指针可以传递给任何需要指向数组元素的指针的函数。
由于此限制,调整大小可能可能降低性能,因为需要将元素复制到新的预分配块。在实践中,这种开销通常只在调整现有向量的大小时才会出现,其中有很多项需要向量将所有对象复制(或移动)到新的内存位置。
在您给出的示例中,没有真正的区别,因为原始向量中没有任何项目(并且许多编译器预先分配了一块内存开始)。如果编译器进行了优化以呈现等效代码,我不会感到惊讶。
【讨论】:
我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关? @Appy 可能。vector<T>::resize
在扩展向量时将默认构造 T
类型的对象。如果没有默认构造函数,你很可能会遇到编译错误。以上是关于C++啥情况下使用PYTHON辅助的主要内容,如果未能解决你的问题,请参考以下文章
在无法访问库源的情况下使用 swig c++ 到 python
在不损失精度的情况下将双精度从 C++ 转移到 python
我在Ubuntu上原有Python2.7的情况下,又装了Python2.4后vi和vim不能使用backspace退格键删除了!啥原因啊