C++ std::vector详解:操作与实践指南

需积分: 3 4 下载量 156 浏览量 更新于2024-09-26 收藏 41KB DOC 举报
标题:"vector的用法.doc"介绍了C++标准模板库中的一种重要数据结构——vector。作为容器类,vector提供了动态数组的功能,支持存储任意类型的数据,并且能够进行高效的插入、删除和访问操作。它在内存管理上比传统的C风格动态数组更为灵活,允许在运行时动态调整大小。 描述详细阐述了vector的特点:首先,它是C++ STL的一部分,具有高度的灵活性和多功能性,能够处理多种数据结构和算法。vector的主要优势在于它的动态性和方便的元素访问,无论是添加新元素还是查找特定位置的元素,都能快速实现。其次,vector支持迭代器操作,如使用条件函数remove_if()和函数指针for_each()进行元素筛选和操作,这些功能在处理复杂的数据处理任务时尤为实用。 为了使用vector,程序员需要在代码中包含<vector>头文件,并选择合适的命名空间,例如`using std::vector;`或`std::vector<int> vInts;`,甚至全局引入命名空间`using namespace std;`,但需要注意这种方式可能导致命名冲突。接下来,文档列出了vector的关键成员函数及其用途: 1. `setElementAt(Object obj, int index)`:用于设置指定索引处的元素值,如`vector.setElementAt(6, 2)`将把第三个元素改为6,`vector.setElementAt(1, 3)`则会改变第四个元素。 2. `assign(beg, end)`:用于将一个区间内的数据复制到vector中,如`c.assign(beg, end)`表示将区间 `[beg, end)` 的数据赋值给vector `c`。 3. `assign(n, elem)`:创建一个由`elem`重复`n`次组成的vector。 4. `at(idx)`:获取指定索引的元素,如果索引越界会抛出`out_of_range`异常。这是对安全访问的一种保证。 5. `back()`:返回并返回vector的最后一个元素,但不检查其存在,适合用于末尾元素的操作。 6. `begin()`:返回指向容器中第一个元素的迭代器,便于遍历。 7. `capacity()`:返回vector当前能容纳的元素数量,可用于判断是否需要调整容器大小。 8. `clear()`:清空vector中的所有元素,减少内存占用。 掌握这些函数和操作后,程序员可以更加高效地使用vector进行数据存储和管理,避免了C风格动态数组的一些局限性。vector是C++编程中不可或缺的一部分,熟练运用它能够提升程序的效率和可维护性。

import sys import re import jieba import codecs import gensim import numpy as np import pandas as pd def segment(doc: str): stop_words = pd.read_csv('data/stopwords.txt', index_col=False, quoting=3, names=['stopword'], sep='\n', encoding='utf-8') stop_words = list(stop_words.stopword) reg_html = re.compile(r'<[^>]+>', re.S) # 去掉html标签数字等 doc = reg_html.sub('', doc) doc = re.sub('[0-9]', '', doc) doc = re.sub('\s', '', doc) word_list = list(jieba.cut(doc)) out_str = '' for word in word_list: if word not in stop_words: out_str += word out_str += ' ' segments = out_str.split(sep=' ') return segments def doc2vec(file_name, model): start_alpha = 0.01 infer_epoch = 1000 doc = segment(codecs.open(file_name, 'r', 'utf-8').read()) doc_vec_all = model.infer_vector(doc, alpha=start_alpha, steps=infer_epoch) return doc_vec_all # 计算两个向量余弦值 def similarity(a_vect, b_vect): dot_val = 0.0 a_norm = 0.0 b_norm = 0.0 cos = None for a, b in zip(a_vect, b_vect): dot_val += a * b a_norm += a ** 2 b_norm += b ** 2 if a_norm == 0.0 or b_norm == 0.0: cos = -1 else: cos = dot_val / ((a_norm * b_norm) ** 0.5) return cos def test_model(file1, file2): print('导入模型') model_path = 'tmp/zhwk_news.doc2vec' model = gensim.models.Doc2Vec.load(model_path) vect1 = doc2vec(file1, model) # 转成句子向量 vect2 = doc2vec(file2, model) print(sys.getsizeof(vect1)) # 查看变量占用空间大小 print(sys.getsizeof(vect2)) cos = similarity(vect1, vect2) print('相似度:%0.2f%%' % (cos * 100)) if __name__ == '__main__': file1 = 'data/corpus_test/t1.txt' file2 = 'data/corpus_test/t2.txt' test_model(file1, file2)

2023-06-13 上传