在回答的过程中的另一个问题,我偶然发现稍有不同的措辞为std::vector::erase()和std::deque::erase().
这就是C++ 14所说的std::deque::erase([deque.modifiers]/4-6强调我的):
效果: ......
复杂性:对析构函数的调用次数与擦除的元素数相同,但对赋值运算符的调用次数不超过删除元素之前的元素数量和次要元素数量之后的次数.擦除元素.
抛出:除非复制构造函数,移动构造函数,赋值运算符或移动赋值运算符抛出异常,否则无效
T.
以下是关于std::vector::erase([vector.modifiers]/3-5)的内容:
效果: ......
复杂性:的析构函数
T被调用的次数等于擦除的元件的数量的数量,但该移动赋值运算符的T被称为的次数等于在向量元素的擦除元件后的数目的数目.抛出:除非复制构造函数,移动构造函数,赋值运算符或移动赋值运算符抛出异常,否则无效
T.
正如您所看到的,两者的异常规范是相同的,但是为了std::vector明确提到它,调用了移动赋值运算符.
还有的要求T是MoveAssignable对erase()两者的工作std::vector和std::deque(表100),但这并不意味着移动赋值运算符的存在:一个可以定义一个拷贝赋值运算符,而不是定义移动赋值操作符,而这个班会是MoveAssignable.
为了以防万一,我检查了GCC和Clang,std::vector::erase()如果没有移动赋值运算符,确实调用了复制赋值运算符,并且std::deque::erase()执行相同的操作(DEMO).
所以问题是:我错过了什么,或者这是标准中的(编辑)问题?
更新: 我已经提交了LWG问题#2477.
关于开关标准说明如下."当执行switch语句时,将评估其条件并与每个case常量进行比较."
这是否意味着条件表达式只评估一次和一次,并且每个编译器的标准都保证了它?
例如,当在switch语句头中使用函数时,会产生副作用.
int f() { ... }
switch (f())
{
case ...;
case ...;
}
Run Code Online (Sandbox Code Playgroud) 当我尝试使用pip升级matplotlib时,它会输出:
Downloading/unpacking matplotlib from https://pypi.python.org/packages/source/m/matplotlib/matplotlib-1.4.0.tar.gz#md5=1daf7f2123d94745feac1a30b210940c
Downloading matplotlib-1.4.0.tar.gz (51.2MB): 51.2MB downloaded
Running setup.py (path:/tmp/pip_build_root/matplotlib/setup.py) egg_info for package matplotlib
============================================================================
Edit setup.cfg to change the build options
BUILDING MATPLOTLIB
matplotlib: yes [1.4.0]
python: yes [2.7.6 (default, Mar 22 2014, 22:59:38) [GCC
4.8.2]]
platform: yes [linux2]
REQUIRED DEPENDENCIES AND EXTENSIONS
numpy: yes [version 1.8.2]
six: yes [using six version 1.7.3]
dateutil: yes [using dateutil version 2.2]
tornado: yes [using tornado version 4.0.1]
pyparsing: yes [using pyparsing version 2.0.2]
pycxx: yes [Couldn't import. Using …Run Code Online (Sandbox Code Playgroud) 让我们关注这个例子:
template<typename T>
class C{
public:
void func(std::vector<T>& vec, std::function<T( const std::string)>& f){
//Do Something
}
};
Run Code Online (Sandbox Code Playgroud)
而现在,我正在努力:
std::vector<int> vec;
auto lambda = [](const std::string& s) { return std::stoi(s); };
C<int> c;
c.func(vec, lambda);
Run Code Online (Sandbox Code Playgroud)
它会导致错误:
no matching function for call to ‘C<int>::func(std::vector<int, std::allocator<int> >&, main()::<lambda(const string&)>&)’
ref.parse(vec, lambda);
Run Code Online (Sandbox Code Playgroud)
请解释一下什么不好,以及如何使用std :: bind实现它.
以下代码的行为是否定义明确?
struct X { int i; }; // trivial
struct Y : X { Y(){} }; // non-trivial
extern X xobj;
int& r1 = xobj.i; // #1
X xobj;
extern Y yobj;
Y& r2 = yobj; // #2
// int& r3 = yobj.i; // #3 - this is UB according to the standard
Y yobj;
Run Code Online (Sandbox Code Playgroud)
此代码的灵感来自C++标准中的示例,即草案N4140 [class.cdtor]/1.
那段是那段内容:
对于具有非平凡构造函数的对象,在构造函数开始执行之前引用对象的任何非静态成员或基类会导致未定义的行为.对于具有非平凡析构函数的对象,在析构函数完成执行后引用对象的任何非静态成员或基类会导致未定义的行为.
下面是一个示例,其中显示了指针如何绑定到对象,也可能不绑定到对象.
如此直观地看起来#1并且#2定义明确,#3如果取消注释则调用UB,但是,首先,示例不是规范性的,其次,示例中没有提及引用,第三个也是最重要的,上面的段落没有意味着否则行为是明确的.或者是吗?或者我错过了标准中的另一个相关引用?
编辑:如果对象具有静态存储持续时间,答案可能(可以说)是肯定的,但它们也可以是本地的,例如:
struct A { A(){} };
struct B { B(A&){} …Run Code Online (Sandbox Code Playgroud) 我注意到lambda既使用函数指针也function使用专用类型g++.
#include <functional>
typedef int(*fptr)(int, int);
int apply_p(fptr f, int a, int b) {
return f(a, b);
}
int apply_f(std::function<int(int, int)> f, int a, int b) {
return f(a, b);
}
void example() {
auto add = [](int a, int b) -> int {
return a + b;
};
apply_p(add, 2, 3); // doesn't give an error like I'd expect it to
apply_f(add, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:哪些是最常用的?使用一个而不是另一个有什么危险和/或好处?
我得到了这个问题的考试:
给定整数数组,使用O(N)时间复杂度和O(1)空间复杂度找到第一个不在数组中重复的数字.
我想不出任何解决方案.我知道我可以迭代数组并维护一个linkedhashmap,它将存储数组元素和它出现的次数,然后最后我必须搜索hashmap来找到那个数字.空间复杂度大于O(1)但我想不出其他解决方案.
我也仔细阅读问题,并说数组的最大尺寸为100万.我认为如果我们可以创建一个自定义散列图,它将使用100万大小的固定大小的数组,那么这可以在O(1)空间复杂度中实现,因为在这种情况下,所需的存储将是恒定的,但如果我是正确的则不确定.如果有任何其他解决方案,请告诉我.
想象一下我写这个奇怪的原因:
int main()
{
struct S
{
int i;
} var;
int decltype(var)::* pint = &decltype(var)::i;
}
Run Code Online (Sandbox Code Playgroud)
GCC似乎编译得很好,尽管Clang失败了一些不确定的语法相关错误消息.
那么神圣的ISO论文对此有何评论 - 这是否有效?
做的有什么区别:
struct A;
struct B { friend struct A; };
Run Code Online (Sandbox Code Playgroud)
和
struct A;
struct B { friend A; };
Run Code Online (Sandbox Code Playgroud)
struct在第二部分中省略了什么意思?
根据NDK的官方下载页面:http://goo.gl/vI7Oek 有两个目标版本:
我想知道(作为NDK中的新手),这是否意味着我应该在为配备x64处理器的设备编译应用程序时使用x64 NDK?
如果我只需要一个".apk"文件,如何使它包含x86和x64版本?(如果可能的话)