我正在尝试编写一个具有 char 数组向量的程序并且遇到了一些问题。
char test [] = { 'a', 'b', 'c', 'd', 'e' };
vector<char[]> v;
v.push_back(test);
抱歉,这必须是一个字符数组,因为我需要能够生成字符列表,因为我试图获得类似的输出。
aa ab ac ad ae ba bc
谁能指出我正确的方向?
谢谢
原文由 aHunter 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试编写一个具有 char 数组向量的程序并且遇到了一些问题。
char test [] = { 'a', 'b', 'c', 'd', 'e' };
vector<char[]> v;
v.push_back(test);
抱歉,这必须是一个字符数组,因为我需要能够生成字符列表,因为我试图获得类似的输出。
aa ab ac ad ae ba bc
谁能指出我正确的方向?
谢谢
原文由 aHunter 发布,翻译遵循 CC BY-SA 4.0 许可协议
实际上,从技术上讲,您可以不直接将 C++ 数组存储在向量中,而是使用简单的解决方法。这很有意义。 anon已经回答了问题,但仍需要一些解释。将数组包装在一个类中将使向量数据满足多维数组的要求。 C++ 11 及更高版本中的 STL 已经提供了这样的包装器 std::array
。
向量的向量 适用于许多目的,但不是答案,在某些情况下它 只是错误 的。由于不了解 数组 和 指针 之间的区别,或者 多维数组 和 数组的数组 之间的区别,陷入修复错误的陷阱是一种不愉快的体验。向量的向量包含作为元素的向量:每个向量都包含大小、容量、指向内存中随机数据段的数据的指针的副本。这些段不会像在多维数组中那样一个接一个地放置。这将导致与其他不支持 C++ 矢量 的编程语言或库的互操作性问题。
但是数组向量将始终指向一个连续的内存段,在一个地方以正确的顺序包含多维数组的所有段。从技术上讲,数据指针将指向与多维数组相同的东西。没有充分的理由保持每个数组元素的大小,而已知它对于所有元素都是相同的。至少它是多余的,但这不是一个大问题。更大的问题是,它破坏了多维数组的结构。
因此,可以通过将数组包装在一个类中或使用现有的 std::array
来间接地制作数组向量。它将数据存储在内存中,与二维数组相同。这种方法已经被许多图书馆广泛使用。在低级别,它将很容易与不支持 C++ 矢量的 API 互操作。因此,如果不使用 std::array ,它将如下所示:
int main()
{
struct ss
{
int a[5];
int& operator[] (const int& i) { return a[i]; }
} a{ 1,2,3,4,5 }, b{ 9,8,7,6,5 };
vector<ss> v;
v.resize(10);
v[0] = a;
v[1] = b;
//all the rest is uninitialised array
v.push_back(a); // pushes to the end, with reallocation
v.push_back(b); // pushes to the new end, with reallocation
auto d = v.data();
// cin >> v[1][3]; //input any element from stdin
cout << "show two element: "<< v[1][2] <<":"<< v[1][3] << endl;
return 0;
}
在内存中它看起来非常可预测,十二个数组,两个在开头,两个在结尾初始化,另外八个在中间未初始化,用零填充
C++11及以上有 std::array
,无需重新发明:
....
#include<array>
....
int main()
{
vector<array<int, 5>> v;
v.reserve(10); //set capacity
v.resize(2);
v[0] = array<int, 5> {1, 2, 3, 4, 5};
v[1] = array<int, 5> {9, 8, 7, 6, 5};
//note, since size does not exceed capacity
//this push_back will cause no reallocation and no relocation:
v.push_back(array<int, 5>{ 7, 2, 53, 4, 5 });
///cin >> v[1][1];
auto d = v.data();
现在,这就是为什么向量的向量不是答案的原因。假设以下代码
int main()
{
vector<vector<int>> vv = { { 1,2,3,4,5 }, { 9,8,7,6,5 } };
auto dd = vv.data();
return 0;
}
数据在内存中是怎么存的永远猜不透,肯定不是多维数组
原文由 armagedescu 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答1.1k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
1 回答1k 阅读
2 回答1.3k 阅读
1 回答1.2k 阅读
您不能将数组存储在向量中(或任何其他标准库容器中)。标准库容器存储的东西必须是可复制和可分配的,而数组既不是这些。
如果您确实需要将数组放入向量中(并且您可能不需要 - 使用向量向量或字符串向量更可能是您需要的),那么您可以将数组包装在一个结构中:
然后创建一个结构向量: