关于Vector的优化,自制StringVector

博客给出了一个名为StringVector的类的代码实现。该类包含添加、移除、获取元素等方法,还实现了容量的动态扩展。在添加和移除元素时会对null值进行处理,确保程序的健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class StringVector{

  private static final int DEFAULT_SIZE = 3;
  private String [] data;
  private int count;
  public StringVector() {

    this(DEFAULT_SIZE);
  }
  public StringVector(int initialSize){

    data = new String[initialSize];
  }
  public void add(String str){

    if(str == null)
      return;
    ensureCapacity(count + 1);
    data[count++] = str;
  }
  private void ensureCapacity(int minCapacity){

    int oldCapacity = data.length;
    if (minCapacity > oldCapacity){

      String oldData[] = data;
      int newCapacity = oldCapacity * 2;
      data = new String[newCapacity];
      System.arraycopy(oldData, 0, data, 0, count);
    }
  }
  public void remove(String str){

    if(str == null)
      return;
    for(int i = 0; i < count; i++){

      if(data[i].equals(str)){

        System.arraycopy(data,i+1,data,i,count-1);
        data[--count] = null;
        return;
      }
    }
  }
  public final String get(int index) {

    if(index < 0)
      return null;
    else if(index > count)
      return null;
    else
      return data[index];
  }
  public int size(){

    return count;
  }
}

<think>嗯,用户询问C++的vector是否支持存储string类型的数据。从用户提供的引用内容来看,用户已经有一定C++基础,特别是对vectorstring容器有基本了解。引用[2]和引用[4]明确提到了vector<string>的使用场景。引用[2]指出vector<string>不能直接拷贝到string对象,这反过来说明vector存储string是合法的。引用[4]的代码示例直接展示了typedef结构体后使用vector<person>,同理vector<string>也是可行的。用户可能正在处理文本数据,需要动态字符串数组。考虑到vector的动态扩展特性和string的文本处理能力,这个组合确实很实用。不过要注意引用[5]提到的连续存储特性:虽然每个string对象在vector中连续存放,但string实际指向的字符串数据在堆上,这点和二维vector<int>的内存布局不同。需要提醒用户注意深拷贝问题。当vector<string>复制时,会复制所有string对象(调用拷贝构造函数),可能影响性能。如果数据量很大,建议用移动语义或指针优化。用户之前问过二维vector初始化,这次问vector<string>,说明ta在系统学习STL容器组合用法。可以预判ta接下来可能会问vector<string>的排序或查找操作。</think>是的,**C++ 的 `vector` 完全支持存储 `string` 类型的数据**,这是标准库中常见的用法。以下是关键说明和示例: --- ### ✅ 核心结论 1. **合法语法**:`vector<string>` 是标准容器模板的特化形式,语法完全合法 2. **动态管理**:vector 自动管理 string 对象的内存,无需手动释放 3. **功能完整**:支持所有 vector 操作(`push_back`、迭代器访问等) --- ### 📝 使用示例 ```cpp #include <iostream> #include <vector> #include <string> using namespace std; int main() { // 创建存储stringvector vector<string> textLines; // 添加字符串元素 textLines.push_back("Hello"); textLines.push_back("C++"); textLines.push_back("STL"); // 初始化列表方式(C++11) vector<string> colors = {"Red", "Green", "Blue"}; // 遍历访问 for (const auto& str : textLines) { cout << str << endl; } /* 输出: Hello C++ STL */ // 修改元素 colors[1] = "Yellow"; // 将"Green"改为"Yellow" return 0; } ``` --- ### ⚠️ 注意事项(引用说明) 1. **类型匹配** 引用[2]明确指出:`vector<string>` 不能直接拷贝到 `string` 对象 ```cpp vector<string> v = {"aa"}; string a(v.begin(), v.end()); // ❌ 编译错误 ``` 2. **内存特性** 引用[4][5]说明: - vector 是**动态数组**,元素在内存中**连续存储** - 每个 `string` 对象本身存储在 vector 中,但其所指的字符串数据在**独立内存区域** ```cpp +---------------------+ | vector<string> | | [0] | string对象1 | ---> "实际字符串数据1" | [1] | string对象2 | ---> "实际字符串数据2" +---------------------+ ``` 3. **高效操作建议** - 使用 `reserve()` 预分配内存避免频繁扩容(引用[5]) ```cpp vector<string> names; names.reserve(100); // 预分配100个元素的空间 ``` --- ### 💡 典型应用场景 1. **文本处理**:存储文件每行内容 2. **词表管理**:单词列表、标签集合 3. **数据解析**:分割 CSV 等格式数据 --- ### 📚 相关问题延伸 1. 如何对 `vector<string>` 中的字符串按长度排序? 2. `vector<string>` 与 `vector<char>` 在存储文本时有何性能差异? 3. 如何避免 `vector<string>` 元素拷贝时的内存开销?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值