C++——vector/string容器

vector容器

理解成一个数组

存放内置数据类型

#include <vector>
#include <algorithm> //标准算法的头文件
#include <iostream>
using namespace std;

void myprint(int val)
{
   
   
	cout << val << endl;
}

//vector容器
void test1()
{
   
   
	vector<int> v; //创建一个vector容器
	
	//向容器中插入数据
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	////第一种遍历方式
	//通过迭代器访问容器数据
	//迭代器相当于是一种指针
	/*
	vector<int> ::iterator itBegin = v.begin(); //起始迭代器,指向容器中第一个元素
	vector<int> ::iterator itEnd = v.end(); //结束迭代器,指向容器中最后一个元素的下一个位置

	while (itBegin != itEnd)
	{
		cout << *itBegin << endl; //相当于对指针解引用
		itBegin++;
	}
	*/

	//第二种遍历方式
	/*
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << endl;
	}
	*/

	//第三种遍历方式
	for_each(v.begin(), v.end(), myprint);
}

存放自定义数据类型

#include <iostream>
using namespace std;
#include <vector>
#include <string>
//vector容器中存放自定义数据类型
class Person
{
public:
	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	string m_name;
	int m_age;
};

void test1()
{
	vector<Person>v;
	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);
	Person p5("eee", 50);

	//向容器中添加数据
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);

	//遍历容器中的数据
	for (vector<Person>::iterator it = v.begin(); it!= v.end(); it++)
	{
		cout << "姓名:" << (*it).m_name << "年龄:" << (*it).m_age << endl;
	}
}

int main()
{
	test1();
	return 0;
}

容器嵌套容器

#include <iostream>
#include <vector>
using namespace std;

void test1()
{
   
   
	vector<vector<int>> v;

	//创建小容器
	vector<int
<think>嗯,用户这次问的是vector<string>作为函数返回值的问题,看来ta对C++容器返回值的理解在深化。之前已经详细解释过普通vector的返回机制,这次聚焦string特化版本很合理——毕竟字符串容器在文本处理中太常用了。 用户引用的资料里[^3]展示了vector<string>的基本操作,但没涉及返回机制。需要强调两点核心:一是string对象本身的移动语义(C++11后string也支持高效移动),二是嵌套容器的优化策略。有趣的是,用户特意标注"不是真正需求",说明ta很清醒地在排除干扰信息。 从ta连续追问容器返回值的习惯看,可能是正在实现某个数据解析模块,需要返回不定长的字符串集合。这类场景下,除了基本的返回值优化,或许还要提醒ta注意SSO(小型字符串优化)的影响——当字符串很小时,vector<string>返回的开销可能比预期更小。 技术上需要补充的是:虽然vectorstring都支持移动,但若函数内存在分支返回不同vector,可能会抑制RVO。不过这种情况在vector<string>和vector<int>上表现一致,所以之前的知识迁移有效。另外,旧标准下用swap技巧减少拷贝的方法对string也适用,但现代C++几乎不需要了。 用户没问但可能隐含的痛点是:返回的vector<string>能否直接用于范围循环?这点可以强调完全兼容,毕竟[^3]里的遍历代码已经展示了基础用法。不过ta没提性能焦虑,暂时不需要展开写时复制之类的深水区内容。</think>是的,**C++ 中的 `vector<string>` 完全可以作为函数的返回值**,这是安全且高效的做法。其核心机制依赖于 **返回值优化(RVO)** 和 **移动语义(C++11 起)**,能避免不必要的拷贝开销。以下是详细分析: --- ### 一、底层机制与安全性 1. **返回值优化(RVO)** 编译器会直接在调用处构造返回的 `vector<string>` 对象,跳过拷贝构造函数[^1][^3]。 示例: ```cpp std::vector<std::string> createStrings() { std::vector<std::string> vec = {"Hello", "World"}; return vec; // 编译器优化:直接在调用处构造对象 } ``` 2. **移动语义(C++11 起)** 若 RVO 未触发,编译器会优先调用移动构造函数: - `vector<string>` 的移动操作仅转移内部指针(如字符串数据地址),时间复杂度 $O(1)$[^2][^3]; - `string` 对象本身也支持移动语义,避免深拷贝字符串内容。 3. **生命周期安全** 局部 `vector<string>` 在函数结束时析构,但通过 RVO 或移动语义返回后,资源所有权已转移给调用者,无悬空指针风险[^3]。 --- ### 二、完整示例代码 ```cpp #include <iostream> #include <vector> #include <string> // 返回 vector<string> 的函数 std::vector<std::string> generateStrings() { std::vector<std::string> words; words.push_back("C++"); words.push_back("Vector"); words.push_back("Return"); return words; // 安全返回(RVO 或移动语义) } int main() { std::vector<std::string> result = generateStrings(); // 遍历输出结果 for (const auto& str : result) { std::cout << str << " "; } // 输出: C++ Vector Return return 0; } ``` --- ### 三、关键注意事项 1. **禁止返回局部对象的引用** ```cpp // 错误!局部变量在函数结束后被销毁 std::vector<std::string>& getInvalidVector() { std::vector<std::string> local = {"error"}; return local; // 未定义行为! } ``` 2. **性能优化建议** - 启用编译器优化(如 GCC 的 `-O2`); - 避免在返回前对 `vector<string>` 进行不必要的拷贝(如传值参数); - 小字符串可能触发 SSO(短字符串优化),进一步减少堆内存操作。 3. **兼容性处理** - **C++11 以下**:依赖编译器 RVO 或使用输出参数(不推荐): ```cpp void oldStyle(std::vector<std::string>& out) { out.push_back("Legacy"); } ``` - **C++11 及以上**:直接返回,利用移动语义(推荐)。 --- ### 四、与其他容器的对比 | 容器 | 作为返回值的效率 | 特点 | |-------------------|------------------------|-------------------------------| | `vector<string>` | 高(移动语义 $O(1)$) | 连续内存,适合随机访问 | | `list<string>` | 中(移动 $O(1)$) | 链表结构,插入/删除快 | | `array<string, N>`| 低(拷贝 $O(N)$) | 固定大小,栈分配,不适合返回 | > 结论:`vector<string>` 是返回动态字符串集合的首选容器。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值