C++是如何处理struct的类型转换的

学术版

看变量声明的先后顺序依次赋值吧 ~~我也不清楚~~
by 凑_友希那 @ 2018-05-07 12:28:08


强制转换一个按照结构体种类型顺序的类型列表…… 实际上应该是调用了构造函数? 比如说我声明了一个结构体 ```C struct data { int v;char c;db x;long long a[2]; }; ``` 那么强制转换的时候应该这样 ``` (data){1,'a',1.0,{9982444353,3}}; ``` 另外你要是不怕被卡常就接着用vector+结构体的形式存临界表,数组的常数会比这个小很多……
by shadowice1984 @ 2018-05-07 12:29:34


第一份代码中,你使用的特性叫做列表初始化,这种特性从C++11起被C++支持,详情参见[列表初始化 (C++11 起) - cppreference.com](http://zh.cppreference.com/w/cpp/language/list_initialization)。 事实上,第二份代码中你未转型的花括号初始化器列表([std::initializer_list](http://zh.cppreference.com/w/cpp/utility/initializer_list))在传递参数的时候会被强制转型成参数的类型(如果初始化器列表能够匹配),因此不应该CE。你最好将编译器的提示信息放出来,这样就知道是为什么CE了。
by KSkun @ 2018-05-07 12:36:02


@[shadowice1984](/space/show?uid=56384) 我一般省事不写链表的时候没被卡过几次2333。而且开O2的情况下vector其实挺快的。
by KSkun @ 2018-05-07 12:37:09


@[KSkun](/space/show?uid=35795) 但是dalao我的error信息是这样的: ![](https://cdn.luogu.com.cn/upload/pic/18777.png)
by yjxyjx @ 2018-05-07 14:22:18


@[yjxyjx](/space/show?uid=51211) 你试一下在编译指令后面加上-std=c++11会不会正常。可能不同编译器对这个的反应不一样,我用的是g++。
by KSkun @ 2018-05-07 14:53:35


@[KSkun](/space/show?uid=35795) 因为正常图一般就是什么最短路还有tarjan和树上的题,这种情况下复杂度很多时候多个log而且图极其稀疏……,瓶颈根本不在vector上 但是如果我们需要边上维护大量信息以及频繁的对边进行访问以及这张图基本快满了呢? 这种情况下vector的劣势就会出来…… 比如你可以尝试着使用vector临接表AC[SDOI2017]新生舞会这道题,然后比较一下和数组版临接表的常数差距…… 或者使用vector版的邻接表去跑一个叫最小割树的玩应……,你就会发现原来vector真的慢…… 另外vector会有一个空间常数(1.5或者2倍size),可能某些卡空间的题(不过基本不可能)也会出事故……
by shadowice1984 @ 2018-05-07 15:03:01


@[shadowice1984](/space/show?uid=56384) 并不是构造函数。这是所谓的聚合初始化。此处只有一个被编译器生成的`trivial default constructor`.因此和构造函数是没有关系的。如果是带有private属性数据成员会直接爆掉。
by constructor @ 2018-05-07 15:47:42


@[shadowice1984](/space/show?uid=56384) @[KSkun](/space/show?uid=35795) 以下代码在C++11下编译成功: ```cpp #include<iostream> #include<vector> using namespace std; struct Tp { int a,b; Tp()=default; Tp(int _a,int _b):a(_a),b(_b){} }; int main() { vector<Tp> Test; Test.push_back({5,4});//列表初始化 Test.push_back(Tp{5,4}); Test.emplace_back(5,4);//转发到构造函数 ,就地构造 } ```
by constructor @ 2018-05-07 15:56:49


@[constructor](/space/show?uid=56461) 所以我在怀疑是不是clang++不加-std=c++11就会编译错误
by KSkun @ 2018-05-07 16:35:32


| 下一页