因此,例如,在GeeksForGeeks.org上,贡献用户“ Kartik”提供了以下示例来初始化整数向量:
// CPP program to initialize a vector from
// an array.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int arr[] = { 10, 20, 30 };
int n = sizeof(arr) / sizeof(arr[0]);
vector<int> vect(arr, arr + n);
for (int x : vect)
cout << x << " ";
return 0;
}
如果我正确理解了我正在阅读的内容,sizeof(arr)
则是某个数字(我认为是数组的长度arr
;即3,如果我错了,请更正我)除以sizeof(arr[0])
(我假设是1)-是3/1 = 3的回旋方式。
此时,vector<int> vect(arr, arr + n)
似乎是一个大小为3的向量,所有值都初始化为arr + n
(我假设这是一种说法,“使用3项从arr
进行实例化;同样,如果我错了,请更正我)”。
通过任何魔术,输出为10 20 30
。
现在,无论我上面的杂乱无章是连贯的,还是遥远的正确,我的主要问题是:可以使用相同的技术来实例化某些示例vector<string> stringVector
,以便它可以通过示例指定的字符串进行迭代string stringArray[] = { "wordA", "wordB", "wordC" }
吗?因为据我了解,字符串没有数字值,所以我想如果vector<string> stringVector(stringArray, stringArray + n)
不遇到一些时髦的垃圾就很难说出来。因此,如果有可能,人们将如何去做呢?
作为骑手,为什么或在哪种类型的情况下,任何人都想对矢量进行此操作?从数组实例化它(据我所知,它具有恒定的大小)是否违反了矢量的目的?
就像免责声明一样,我是C ++的新手,并且涉及std::vector<_Ty, _Alloc>::vector
... etc之类的很多面向对象的语法。对我来说绝对没有意义,所以我可能需要在答案中进行解释。
对于阅读此书的人,谢谢您抽出宝贵的时间。希望您过得愉快!
sizeof
获取对象的大小(以字节为单位)。对象的大小是该对象所需的字节总数。请注意,我在C ++上下文中使用“对象” ,而不是OOP上下文(类的实例)。
给定类型的对象的大小始终相同。“std::string
包含”"a"
的大小与string
包含“战争与和平”未删节文本的包含大小相同。任何看起来具有可变大小的对象实际上都包含对存储在其他位置的可变长度数据的引用。在std::string
最基本的情况下,它是指向动态分配的数组的指针,并且是一个整数,用于跟踪实际使用了多少动态分配的数组string
。std::vector
类似,通常是指向其数据开头的指针,指向其数据结尾的指针和指向数据中第一个空位置的指针。无论有多大vector
,sizeof(vector)
都将返回指针的大小,以及其他任何簿记变量vector
实现,以及确保正确对齐内存所需的任何填充。
这意味着数组中的每个项目始终具有相同的大小,因此彼此之间的距离也相同。
上面的意思是数组的总大小除以数组中一个元素的大小sizeof(arr) / sizeof(arr[0])
,将始终提供数组中元素的数量。数组包含什么(数字或其他形式)都没有关系。当然有更漂亮的方式,例如
template <class T, size_t N>
size_t getsize (const T (&array)[N])
{
return N;
}
然后
size_t n = getsize(arr);
在过去,人们无法直接构建vector
预先加载的数据。没有人愿意写任意数量的行push_back
来手动敲打所有值。这太无聊了,程序员几乎总是有更好的事情要做,并且注入错误的几率太大。但是,您可以轻松轻松地格式化数组并将其输入vector
,如果需要的话vector
。很多时候,由于内容不变,或者最糟糕的是,内容只会被改组,因此您可以独自依靠数组生存。
但是,如果内容的数量可以改变,那可能是时候了vector
。如果您要添加项目而又不知道上限,那么该是了vector
。如果您要调用需要一个的API vector
,那么该时候该了了vector
。
我不能代表所有人,但是我将假设像我一样,很多人都希望对vector
s,list
s,map
s和其他普通黑帮进行简单的数组式初始化。
我们被迫编写生成适当代码的程序来填充vector
或定义一个数组,然后将该数组复制到vector
上面的示例中。
在C ++ 11我们得到了我们的愿望std::initialzer_list
和各种新的初始化选项1,允许
vector<string> vect{"abc","def","ghi"};
消除了大多数情况下您会发现自己将数组复制到库容器中的情况。群众欢欣鼓舞。
这与诸如之类的许多工具不谋而合std::size
,std::begin
并且std::end
可以将数组转换成vector
蛋糕。假设您没有先将数组传递给函数。
1不幸的是,初始化选项列表可能会让您感到困惑
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句