C++容器--set_string

本文详细介绍了C++标准库中set与multiset容器的使用方法,包括数据的插入、删除、查找等功能,并通过具体示例展示了如何自定义比较器以支持复杂类型的排序。

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

#include <iostream>
#include <set>
#include <string>


using namespace std;


void printS(set<int> &s)
{
set<int>::iterator it = s.begin();
while(it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}


void printS(set<int,greater<int>> &s)
{
set<int,greater<int>>::iterator it = s.begin();
while(it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
//插入 ,删除数据
void func1()
{
//set集合 内部数据默认是从小到大排序
//set 内部数据时不允许重复的
set<int,less<int>> s;
//set<int,greater<int>> s;


s.insert(1);
s.insert(3);
s.insert(4);
s.insert(9);
s.insert(8);


printS(s);


s.erase(s.begin());
}


class Student
{
public:
Student(int id,const string &name)
{
this->id = id;
this->name = name;
}
void print()const
{
printf("id = %d,name = %s\n",id,name.c_str());
}
int getId()const
{
return id;
}


string GetName()const
{
return name;
}
private:
int id;
string name;
};


//比较的类:比较两个学生的大小
class MyCompare
{
public:
bool operator()(const Student &left,const Student &right)
{
return left.GetName() > right.GetName();
//return left.getId() < right.getId();
}
};


void func2()
{
Student stus[] = {
Student(1,"小明"),
Student(10,"小芳"),
Student(6,"小红"),
Student(3,"小张"),
};
//set 集合是一个排号序的集合,插入 不知道怎么对学生数据进行排序
//比较大小 ===> 交换
//自己写比较大小的函数
set<Student,MyCompare> s;
s.insert(stus[0]);
s.insert(stus[1]);
s.insert(stus[2]);
s.insert(stus[3]);


set<Student,MyCompare>::iterator it = s.begin();
while(it != s.end())
{
//集合内部的数据是不允许修改的
it->print();
it++;
}
}


//返回值
void func3()
{
set<int> s;
s.insert(1);
s.insert(3);
s.insert(4);


//pair对组,将一组数据整合到一块,当一个数据使用
//first:对组中的第一个元素,迭代器,插入成功的那个元素的迭代器
//second:对组中的第二个元素,bool类型,表示插入成功还是没成功
pair<set<int>::iterator,bool> ret = s.insert(6);
if(ret.second)
cout << "插入成功" << endl;
else
cout << "插入失败" << endl;


ret = s.insert(4);
if(ret.second)
cout << "插入成功" << endl;
else
cout << "插入失败" << endl;
}
//查找
void func4()
{
set<int> s;
s.insert(1);
s.insert(3);
s.insert(5);
//找到返回找到的元素的迭代器,没找到返回 s.end()
set<int>::iterator it = s.find(3);
if(it == s.end())
cout << "没找到" << endl;
else
cout << "找到" <<  *it << endl;
//返回第一个大于要查找的元素的迭代器
it = s.upper_bound(3);
if(it == s.end())
cout << "没找到" << endl;
else
cout << "找到" << *it << endl;
//返回第一个大于等于要查找的元素的迭代器
it = s.lower_bound(3);
if(it == s.end())
cout << "没找到" << endl;
else
cout << "找到" << *it << endl;


//第一个:等价于lower_bound
//第二个:等价于uooer_bound
pair<set<int>::iterator,set<int>::iterator> ret = s.equal_range(3);
if(ret.first == s.end())
cout << "没找到" << endl;
else
cout << "找到" << *it << endl;


if(ret.second == s.end())
cout << "没找到" << endl;
else
cout << "找到" << *it << endl;
}
//multiset
void func5()
{
multiset<int> s;
s.insert(1);
s.insert(10);
s.insert(3);
s.insert(4);
s.insert(5);


multiset<int>::iterator it = s.begin();
while(it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
cout << s.count(3) << endl;
}
int main()
{
func5();
return 0;
}
<think>我们已知用户需求:在Vite项目中集成ace-builds并配置C/C++语言支持。步骤:1.安装ace-builds2.在Vite项目中引入ace-builds3.配置ace编辑器,设置语言模式为C/C++注意:由于Vite是原生支持ES模块的构建工具,而ace-builds提供了多种引入方式,我们需要选择适合Vite的方式。具体步骤:1.安装ace-builds包```bashnpminstallace-builds#或者yarnaddace-builds```2.在组件中引入ace-builds由于ace-builds的默认导出方式可能不是直接支持ES模块的,我们需要查找正确的入口。通常我们使用`ace-builds/src-noconflict`下的文件。3.在Vite项目中,我们可以这样引入:```javascriptimportacefrom'ace-builds';import'ace-builds/src-noconflict/mode-c_cpp';//引入C/C++语言模式import'ace-builds/src-noconflict/theme-chrome';//引入一个主题,这里以chrome主题为例```4.在组件挂载后初始化编辑器5.注意:可能需要配置Vite的优化(optimizeDeps)来避免一些警告或错误。但是,根据ace-builds的官方文档和实际使用,我们可能会遇到以下问题:-在Vite中直接使用`importacefrom'ace-builds'`可能得不到我们想要的,因为ace-builds没有默认导出。-通常我们这样引入:import*asacefrom'ace-builds';或者importacefrom'ace-builds/src-noconflict/ace';因此,更常见的做法是:步骤详细说明:第一步:安装```bashnpminstallace-builds```第二步:在组件中:```javascript//引入ace,注意这里我们从src-noconflict目录中引入aceimportacefrom'ace-builds/src-noconflict/ace';//然后引入需要的语言模式、主题等import'ace-builds/src-noconflict/mode-c_cpp';import'ace-builds/src-noconflict/theme-chrome';//也可以使用动态导入,但这里我们使用静态导入```第三步:在模板中放一个div作为编辑器的容器```html<divid="editor"style="height:400px;width:600px;"></div>```第四步:在组件的mounted钩子中初始化编辑器```javascriptace.edit('editor',{mode:'ace/mode/c_cpp',theme:'ace/theme/chrome',//其他配置...});```注意:在Vite项目中,由于Vite对静态资源的处理,我们可能会遇到ace找不到worker文件的错误。这是因为ace需要worker脚本来处理语法高亮等,而这个文件在构建时可能没有被正确复制或引用。解决方案:-设置ace的basePath,指向正确的路径。我们可以将node_modules/ace-builds/src-min-noconflict(或者src-noconflict)中的worker文件复制到public目录下,然后设置basePath为这个路径。但是,更好的方式是使用ace提供的配置来指定worker路径,因为Vite在构建时会将public目录下的文件复制到根目录。步骤:-将`node_modules/ace-builds/src-min-noconflict`目录下的`worker-c_cpp.js`(或者整个`worker`文件夹)复制到`public`目录下(也可以选择复制所有worker文件)。-然后,在初始化ace之前,设置:ace.config.set('basePath','/path/to/worker/dir');这里通常我们设置为`/public`目录下的路径,但注意public目录下的文件在运行时位于根目录。例如,如果我们把worker文件夹复制到了public下,那么basePath应该设置为`/workers`(注意:在public目录下创建workers目录,然后把所有worker文件放进去,然后设置`/workers`)。但是,我们也可以利用Vite的构建功能,将worker文件作为静态资源引用。但ace要求worker文件必须在指定路径下可访问。另一种方案:使用ace.config.setModuleUrl来指定特定worker的路径(官方推荐方式):```javascriptimportworkerCppUrlfrom'ace-builds/src-noconflict/worker-c_cpp?url';//注意:这里需要Vite支持url导入ace.config.setModuleUrl('ace/mode/c_cpp_worker',workerCppUrl);```但是,Vite支持使用`?url`后缀导入静态资源作为URL。所以我们可以这样:在Vite项目中,我们可以这样配置每个worker模块的URL:```javascriptimportacefrom'ace-builds/src-noconflict/ace';import'ace-builds/src-noconflict/mode-c_cpp';import'ace-builds/src-noconflict/theme-chrome';//引入worker的URLimportworkerCppUrlfrom'ace-builds/src-noconflict/worker-c_cpp?url';//设置workerace.config.setModuleUrl('ace/mode/c_cpp_worker',workerCppUrl);```然后,当初始化编辑器并设置mode为'ace/mode/c_cpp'时,会自动加载这个worker。注意:这种方式需要为每种语言模式单独设置worker的URL。完整组件示例(假设使用Vue3和CompositionAPI):```vue<template><divref="editorEl"style="height:400px;width:100%;"></div></template><scriptsetup>import{ref,onMounted}from'vue';importacefrom'ace-builds/src-noconflict/ace';import'ace-builds/src-noconflict/mode-c_cpp';import'ace-builds/src-noconflict/theme-chrome';importworkerCppUrlfrom'ace-builds/src-noconflict/worker-c_cpp?url';consteditorEl=ref(null);onMounted(()=>{ace.config.setModuleUrl('ace/mode/c_cpp_worker',workerCppUrl);consteditor=ace.edit(editorEl.value,{mode:'ace/mode/c_cpp',theme:'ace/theme/chrome',//可选配置:启用自动换行等wrap:true});});</script>```注意:如果使用TypeScript,可能会报错,因为无法识别?url。我们需要在vite-env.d.ts中声明模块:```typescriptdeclaremodule'ace-builds/src-noconflict/worker-*'{consturl:string;exportdefaulturl;}```或者针对具体文件:```typescriptdeclaremodule'ace-builds/src-noconflict/worker-c_cpp'{consturl:string;exportdefaulturl;}```如果遇到其他主题或者扩展的引入问题,类似处理。另外,也可以尝试使用vite-plugin-ace,但目前似乎没有专门为Vite开发的ace插件,所以上述方式更为直接。总结:-安装ace-builds。-在组件中引入ace以及需要的语言模式和主题。-使用`?url`导入worker文件,然后通过`ace.config.setModuleUrl`设置worker路径。-初始化编辑器。这样,在Vite项目中就能正常使用ace编辑器并支持C/C++语言了。</think> 在 Vite 项目中集成 `ace-builds` 实现 C/C++ 代码编辑功能,需按以下步骤操作: --- ### 1. 安装依赖 ```bash npm install ace-builds # 或 yarn add ace-builds ``` --- ### 2. 基础集成(Vue 示例) ```vue <template> <div ref="editor" style="height: 400px; width: 100%; border: 1px solid #ddd"></div> </template> <script setup> import { ref, onMounted } from 'vue'; import ace from 'ace-builds'; import 'ace-builds/src-noconflict/mode-c_cpp'; // C/C++ 语言支持 import 'ace-builds/src-noconflict/theme-monokai'; // 主题(可选) const editor = ref(null); onMounted(() => { const editorInstance = ace.edit(editor.value, { mode: 'ace/mode/c_cpp', // 设置语言模式 theme: 'ace/theme/monokai', // 主题 fontSize: 14, showPrintMargin: false }); // 设置初始代码 editorInstance.setValue(`#include <iostream>\n\nint main() {\n std::cout << "Hello, Ace!";\n return 0;\n}`); }); </script> ``` --- ### 3. 关键配置说明 1. **语言模式** - 导入模式:`import 'ace-builds/src-noconflict/mode-c_cpp'` - 激活模式:`editor.session.setMode('ace/mode/c_cpp')` 2. **语法高亮** 自动生效,无需额外配置 3. **Worker 配置(必需)** 解决 Vite 动态加载问题: ```js // 在入口文件(如 main.js)中配置 import workerCppUrl from 'ace-builds/src-noconflict/worker-c_cpp?url'; ace.config.setModuleUrl('ace/mode/c_cpp_worker', workerCppUrl); ``` --- ### 4. 完整特性配置 ```js // 初始化高级配置 const editorInstance = ace.edit(/*...*/); // 启用功能 editorInstance.setOptions({ enableBasicAutocompletion: true, // 基础自动补全 enableLiveAutocompletion: true, // 实时自动补全 enableSnippets: true, // 代码片段 highlightActiveLine: true, // 高亮当前行 autoScrollEditorIntoView: true // 自动滚动 }); // 设置 C++ 特定规则 editorInstance.session.setMode('ace/mode/c_cpp'); editorInstance.session.setValue('// C++ 代码...', -1); // -1 保留光标位置 ``` --- ### 5. TypeScript 支持 在 `env.d.ts` 中添加类型声明: ```ts // env.d.ts declare module 'ace-builds/webpack-resolver' { const resolver: any; export default resolver; } ``` --- ### 6. 常见问题解决 - **报错 "Could not load worker"** 检查步骤 3 的 worker 配置是否完整 - **主题不生效** 确保已导入主题:`import 'ace-builds/src-noconflict/theme-xxx'` - **语法高亮缺失** 确认语言模式设置正确:`mode: 'ace/mode/c_cpp'` --- ### 7. 可选优化 ```js // 动态导入节省体积 const { default: modeCpp } = await import('ace-builds/src-noconflict/mode-c_cpp'); editor.session.setMode(new modeCpp.Mode()); // 使用 Webpack 解析器(需安装) import ace from 'ace-builds/webpack-resolver'; ``` --- ### 实现效果 最终将获得: 1. C/C++ 语法高亮 2. 代码自动补全 3. 错误检测(需扩展) 4. 多主题支持 5. 代码折叠功能 [^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值