gpt4 book ai didi

c++ - 整数 vector vector 的统一初始化

转载 作者:可可西里 更新时间:2023-11-01 15:24:56 27 4
gpt4 key购买 nike

C++11

程序初始化一个vector , 命名为 myVec , 属于 int vector s,然后使用循环打印出每个内部 vector的元素。但是当我试图查看使用额外花括号时会发生什么时,我得到了意想不到的结果。下面也在this LiveWorkSpace上以便在编译器之间轻松切换。 g++ 4.8.0最多只能编译 myVec[5] . clang++ 3.2编译一切:

#include <iostream>
#include <vector>

int main()
{
std::vector<std::vector<int>> myVec =
{
/* myVec[0] */ {1, 2},
/* myVec[1] */ {},
/* myVec[2] */ {{}},
/* myVec[3] */ { {}, {} },
/* myVec[4] */ { {}, {}, {} },
/* myVec[5] */ {{{}}}

/* myVec[6] */ // , { {{}}, {{}} } // g++ 4.8.0 COMPILER ERROR
/* myVec[7] */ // , {{{{}}}} // g++ 4.8.0 COMPILER ERROR
/* myVec[8] */ // , { {{{}}}, {{{}}} } // g++ 4.8.0 COMPILER ERROR
};

// loop for printing
for (unsigned int i = 0; i < myVec.size(); ++i)
{
std::cout << "myVec[" << i << "]: ";
for (unsigned int j = 0; j < myVec.at(i).size(); ++j)
{
std::cout << myVec.at(i).at(j) << ", ";
}
std::cout << std::endl;
}
return 0;
}

实际 g++ 4.8.0输出:

myVec[0]: 1, 2,
myVec[1]:
myVec[2]: 0,
myVec[3]: 0, 0,
myVec[4]: 0, 0, 0,
myVec[5]: 0,

分析:

myVec[0] : {1, 2} :

得到了预期的输出。

myVec[1] : {} :

得到了预期的输出。

myVec[2] : {{}} :

这是 int 的 vector 0 .内部大括号初始化一个 int0 .

myVec[3] : { {}, {} } :

两个内括号初始化一个 int每个到0 .

myVec[4] : { {}, {}, {} } :

三个内括号初始化一个 int每个到0 .

myVec[5] : {{{}}} :

我想为 myVec[2] 添加另一组花括号看看在出现编译器错误之前我可以通过添加大括号走多远。我不明白为什么这会编译以及为什么它的元素打印为 0 .

例如,int j = {}初始化 j0 . vector<vector<int>> v = { {{}} }初始化最里面的 {}int 0 , 使其等同于 vector<vector<int>> v = { {0} } .那么,什么是vector<vector<int>> u = { {{{}}} }为什么会编译?

假设 myVec[6] : { {{}}, {{}} } :

按照与上面相同的模式,我想制作一个包含两组双花括号的 vector 。但这无法编译,我不明白为什么这打破了给我多个零的模式。

假设 myVec[7] : {{{{}}}} :

我想为 myVec[5] 添加另一组花括号看看在出现编译器错误之前我可以通过添加大括号走多远。我不明白为什么这会破坏模式并且无法编译。

假设 myVec[8] : { {{{}}}, {{{}}} } :

我想扩展 myVec[7]来制作一个带有两组三重括号的 vector 。我不明白为什么这也不能编译。

如果一切都达到 myVec[5]编译,其余的为什么不编译?

最佳答案

尝试编译这段代码。它应该解释你的问题:

int i = {};   // initializes i to int()
int j = {{}}; // fails to compile

为什么 {{{}}} 在您的代码中被接受似乎是一个 gcc 错误(需要澄清)与 ctor 的处理方式有关:

struct foo {
foo( std::initializer_list<int> ) {}
};
void f()
{
foo bar1( {{{}}} ); // compiles fine
foo bar2 = {{{}}}; // compiles fine
}

编辑(感谢 Johannes Schaub)——删除复制构造函数使得第一个变体不可编译:

struct foo {
foo( std::initializer_list<int> ) {}
foo( const foo& ) = delete;
};
void f()
{
foo bar1( {{{}}} ); // fails to compile: use of deleted function ‘foo::foo(const foo&)’
foo bar2 = {{{}}}; // still compiles, neither deleting move ctor, nor assignment operator does not affect that, is copy ctor of std::initializer_list involved?
}

对于成员函数它失败了:

struct foo {
void moo( std::initializer_list<int> ) {}
};
void f()
{
foo bar;
bar.moo( {{{}}} ); // fails to compile
}

此代码也失败了:

std::initializer_list<int> l = {{{}}}; // fails to compile

相同情况的 ctor 与 std::vector 的成员函数:

void f()
{
std::vector<int> v( {{{}}} ) // compiles fine;
v.assign( {{{}}} ); // fails to compile
};

gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)

关于c++ - 整数 vector vector 的统一初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182712/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com