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构造函数,它的第一个参数是count
n
(初始化向量的元素数),第二个参数是复制
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构造函数,它的第一个参数是count
n
(初始化向量的元素数),第二个参数是复制
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循环中的类型。就我个人而言,我会