gpt4 book ai didi

c++ - 在 C++ 中将元素插入 2D Vector 的顺序

转载 作者:行者123 更新时间:2023-11-28 00:01:22 32 4
gpt4 key购买 nike

我在练习 C++ vector 时,在将元素插入 2D vector 时发现了一个问题。在下面的例子中:

#include <iostream>
#include <vector>

void fillVector(std::vector<std::vector<int> > &vec) {
std::vector<int> list1;
vec.push_back(list1);
list1.push_back(1);
list1.push_back(2);

std::vector<int> list2;
list2.push_back(3);
list2.push_back(4);
vec.push_back(list2);

return;
}

int main() {
std::vector<std::vector<int> > vect;
fillVector(vect);

std::cout << "vect size: " << vect.size() << std::endl;

for(int i = 0; i < vect.size(); i++) {
std::cout << "vect in size: " << vect.at(i).size() << std::endl;
}
}

第一个内部列表的大小为 0,第二个内部列表的大小为 2。list1list2 之间的唯一区别是 list1 首先被插入到 vec 二维 vector 中,然后元素被插入其中,而元素首先被插入到 list2 中,然后它自己被插入到二维 vector 中。函数返回后,插入到list1中的元素不会被打印出来,它的大小保持不变。

我也尝试用指针代替第一种方法,

std::vector<int> *list3 = new std::vector<int>();
vec.push_back(*list3);
list3->push_back(5);
list3->push_back(6);

但是,从调用函数读取时 list3 的大小仍然为 0。我不明白这两种方法之间的区别。为什么必须在插入元素后追加列表?

最佳答案

您似乎在期待类似 Python 的行为?无论如何,在 C++ 中,引用、指针和值之间的区别非常重要。

你的 fillVector函数有正确的想法,因为它引用了一个二维 vector std::vector<std::vector<int> > &vec - 注意 & .但是,当您创建 list1 ,并使用 push_back()马上

std::vector<int> list1;
vec.push_back(list1);

您正在插入空 vector 。 push_back()将创建此 vector 的拷贝,它将包含在 vect 中(在 main 中),并且是与 list1 完全独立的 vector .

此时如果想访问已经推送的vector,可以使用back() ,它返回对 vector 中最后一个元素的引用 vec ,也就是最后推送的。

vec.back().push_back(1);
vec.back().push_back(2);

list2您在推回之前进行了修改,因此在制作拷贝时,它是由已经修改过的 vector 组成的。您对 list3 的尝试并没有真正改变太多,当你 push_back() 时你取消引用指针和拷贝都是一样的。你可以制作 vectstd::vector<std::vector<int>*> , 但我强烈反对它,因为你必须进行手动内存管理 - 使用 new .

注意:虽然在某些时候学习对您来说很重要,但您真的应该尽可能避免使用指针,特别是 RAW 指针(请参阅 smart pointers)。 std::vector ,以及所有其他 std我所知道的容器会进行自己的内存管理——他们肯定会比你更高效,而且没有 BUG。


我建议您只处理最后推送的 vector ,如下所示:

void fillVector(std::vector<std::vector<int> > &vec) {
vec.push_back(std::vector<int>());
vec.back().push_back(1);
vec.back().push_back(2);

vec.push_back(std::vector<int>());
vec.back().push_back(3);
vec.back().push_back(4);
return;
}

如您所见,几乎相同的代码重复了两次,因此您可以轻松地循环以获得这个或其他结果。

关于c++ - 在 C++ 中将元素插入 2D Vector 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38779328/

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