C++ 向量C++;大小和访问元素
我有一个密码C++ 向量C++;大小和访问元素,c++,vector,C++,Vector,我有一个密码 vector<vector<double> > times(pCount, vector<double>(5,0.0)); 向量时间(pCount,向量(5,0.0)); 我的问题是,它分配的矩阵的大小是多少?如果需要访问其中的所有值,我可以做什么?您有一个pCount×5矩阵。第一个索引可以介于0和pCount-1之间(包括),第二个索引可以介于0和4之间(包括)。所有值都初始化为0 这是因为您使用的是std::vector构造函数,它的第
vector<vector<double> > times(pCount, vector<double>(5,0.0));
向量时间(pCount,向量(5,0.0));
我的问题是,它分配的矩阵的大小是多少?如果需要访问其中的所有值,我可以做什么?您有一个
pCount×5
矩阵。第一个索引可以介于0和pCount-1之间(包括),第二个索引可以介于0和4之间(包括)。所有值都初始化为0
这是因为您使用的是std::vector构造函数,它的第一个参数是countn
(初始化向量的元素数),第二个参数是复制n
次的值。因此,times
是一个带有pCount
元素的向量,每个元素都是一个向量。这些向量中的每一个都是所提供的向量(5,0.0)
的副本,该向量由5个元素构成,每个元素都是0.0
您可以获得任何单个值,如乘以[3][2]
,或者您拥有的任何值。使用C++11或更高版本,您可以迭代所有值,如下所示:
for (auto& v : times)
for (double& d : v)
d += 3.14; // or whatever
如果您不需要修改这些值,而只需要访问它们,则可以删除符号,或者最好执行以下操作:
for (const auto& v : times)
for (double d : v)
std::cout << d << ", "; // or whatever
for(const auto&v:times)
用于(双d:v)
std::cout您有一个pCount×5
矩阵。第一个索引可以介于0和pCount-1之间(包括),第二个索引可以介于0和4之间(包括)。所有值都初始化为0
这是因为您使用的是std::vector构造函数,它的第一个参数是countn
(初始化向量的元素数),第二个参数是复制n
次的值。因此,times
是一个带有pCount
元素的向量,每个元素都是一个向量。这些向量中的每一个都是所提供的向量(5,0.0)
的副本,该向量由5个元素构成,每个元素都是0.0
您可以获得任何单个值,如乘以[3][2]
,或者您拥有的任何值。使用C++11或更高版本,您可以迭代所有值,如下所示:
for (auto& v : times)
for (double& d : v)
d += 3.14; // or whatever
如果您不需要修改这些值,而只需要访问它们,则可以删除符号,或者最好执行以下操作:
for (const auto& v : times)
for (double d : v)
std::cout << d << ", "; // or whatever
for(const auto&v:times)
用于(双d:v)
std::cout这在大小上相当于标准数组的[pCount][5]
double[pCount][5] = {{0.0, 0.0, 0.0, 0.0, 0.0}, // |
{0.0, 0.0, 0.0, 0.0, 0.0}, // |
{0.0, 0.0, 0.0, 0.0, 0.0}, // | pCount = 5
{0.0, 0.0, 0.0, 0.0, 0.0}, // |
{0.0, 0.0, 0.0, 0.0, 0.0}}; // |
当然,您使用的是向量,因此在创建次之后,行和列的数量可以是可变的
std::vector
包含对的覆盖,因此您可以使用该运算符访问数据
auto Val=times[2][3]
这在大小上相当于标准数组的[pCount][5]
double[pCount][5] = {{0.0, 0.0, 0.0, 0.0, 0.0}, // |
{0.0, 0.0, 0.0, 0.0, 0.0}, // |
{0.0, 0.0, 0.0, 0.0, 0.0}, // | pCount = 5
{0.0, 0.0, 0.0, 0.0, 0.0}, // |
{0.0, 0.0, 0.0, 0.0, 0.0}}; // |
当然,您使用的是向量,因此在创建次之后,行和列的数量可以是可变的
std::vector
包含对的覆盖,因此您可以使用该运算符访问数据
auto Val=times[2][3]
查看std::vector
你认为它是什么?问问自己它是行堆栈还是列堆栈……查看std::vector
你认为它是什么?问问自己它是行堆栈还是列堆栈……
看起来像一种特殊的语法,你应该用一个注释。实际上它有点大。这个例子有一个vector@user4581301当他们说size
时,我的假设是分配的双元素的数量,而不是向量本身的大小。但是,是的,根据实现情况,有可能会使用更多内存作为维护向量的开销。内存也不是连续的,但可以访问,就好像它是由于重载的运算符[]
,但是块内存操作,如memset
将不起作用(但无论如何也不应用于向量),虽然大小相等,但在一个重要方面并不真正相等-上面的矩阵在内存中是连续的,而向量的向量是不正确的。@cocarin足够正确。我有点迂腐。|
看起来像是一种特殊的语法,你应该使用注释。实际上它有点大。这个例子有一个vector@user4581301当他们说size
时,我的假设是分配的双元素的数量,而不是向量本身的大小。但是,是的,根据实现情况,有可能会使用更多内存作为维护向量的开销。内存也不是连续的,但可以访问,就好像它是由于重载的运算符[]
,但是块内存操作,如memset
将不起作用(但无论如何也不应用于向量),虽然大小相等,但在一个重要方面并不真正相等-上面的矩阵在内存中是连续的,而向量的向量是不正确的。@cocarin足够正确。我有点迂腐,只是挑了点毛病;为什么不使用auto
作为的嵌套范围呢?@NathanOliver:嗯,对于简单类型,我想看看它是什么。例如,如果不是浮点,那么添加3.14就没有多大意义。在第二个例子中,我使用了double d
而不是const double&d
,因为复制一个内置函数比使用引用便宜,但是如果d
是另一种情况,那就不正确了。@NathanOliver,同意Kundor的观点。当类型简单且已知时,最好给它们命名。帮助将来的代码读者。但是,通过值传递双精度通常比通过引用传递更便宜:)(当然,这取决于优化器的心情)次[i]。在C++11之前的示例中,size()
应该真正用作内部循环的条件,而不是静态的5
,作为向量,有效范围可以修改。@SergeyA Meh。这使得可维护性更加困难,因为您必须记住更改for循环中的类型。就我个人而言,我会