如何直接访问函数内静态vector的结构体成员而不复制?
解决方案
要直接访问readData函数里的静态vector<Person>而不触发复制,你需要用引用或者指针绑定返回结果,而非创建新的vector对象。
方法1:用引用绑定(推荐)
在main里用引用类型接收返回值,直接关联到静态容器,完全避免拷贝:
#include <iostream> #include <vector> #include <string> struct Person { std::string name{}; int age{}; }; std::vector<Person>& readData() { int length{2}; static std::vector<Person> listOfPeople(length); for(int i{0}; i<length; ++i) { std::cout << "Enter name: "; std::cin >> listOfPeople[i].name; std::cout << "Enter age: "; std::cin >> listOfPeople[i].age; // 原代码里创建两个Person对象完全没必要,直接操作容器内元素更高效 } return listOfPeople; } int main() { // 用引用绑定,直接指向静态vector std::vector<Person>& foo = readData(); // 打印所有成员 std::cout << "\nPrinting people:\n"; for(const auto& person : foo) { std::cout << "Name: " << person.name << ", Age: " << person.age << '\n'; } return 0; }
方法2:用指针访问
如果想用指针,对返回的引用取地址即可,注意指针类型匹配:
int main() { // 对返回的引用取地址,得到指向静态vector的指针 std::vector<Person>* foo = &readData(); // 打印所有成员,注意解引用指针 std::cout << "\nPrinting people:\n"; for(const auto& person : *foo) { std::cout << "Name: " << person.name << ", Age: " << person.age << '\n'; } return 0; }
关键说明
- 你之前的
std::vector<Person> foo {readData()}会触发vector的拷贝构造,把静态容器的内容复制到新对象foo中,这就是为什么违背了返回引用的初衷。 - 用引用绑定后,
foo只是原静态容器的别名,所有操作都会直接作用在原容器上。 - 原
readData里的Person Name和Person Age属于冗余代码,直接修改listOfPeople[i]的成员更简洁高效。
内容的提问来源于stack exchange,提问作者kvrier
相关产品推荐
相关产品推荐

