日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C++?容器?Vector?的使用方法_C 語言

作者:??zidea???? ? 更新時(shí)間: 2022-07-31 編程語言

前言:

我們都是帶著問題學(xué)習(xí),假設(shè)一個(gè)任務(wù),也可以理解為一個(gè)問題,通過找解決方案來提升自己 c++ 的編程能力,嘗試這是否一條好的路線,希望找到這種學(xué)習(xí)方式有效

問題簡(jiǎn)單描述一下,就是從以字符串,課程名稱組成的集合中將一些包含特定文字,將其從列表中刪除

Vector簡(jiǎn)介

  • Vector 是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組,有點(diǎn)類似數(shù)組,是一個(gè)連續(xù)地址空間,

Vector 與數(shù)組

  • Vector 是支持動(dòng)態(tài)空間大小調(diào)整
  • 數(shù)組往往在定義需要指定固定大小
#include<vector>

要使用 vector 需要引入一下其頭文件

創(chuàng)建 vector 的各種方法

  • 創(chuàng)建一個(gè) T 類型的空 vector
  • 創(chuàng)建時(shí)可以指定容量大小
  • 創(chuàng)建時(shí)不但可以指定容量大小,還可以指定元素初始值
  • 創(chuàng)建一個(gè)基于已有 vector 的拷貝
  • 基于數(shù)組來創(chuàng)建 vector
vector<int> v1;
vector<int> v2(5);
vector<int> v3(5, 0);
vector<int> copyOf(v3);
int arr[] = { 1,2,3,5,7,9 };
vector<int> v5(arr, arr + 6);
	v5.push_back(11);

向一個(gè) vector 中添加元素

	bool isEmpty = v1.empty();

訪問 vector 的元素

  • 調(diào)用?vector::at()
  • 調(diào)用?vector::operator[]

兩者的區(qū)別在于

  • operator[] 提供類似數(shù)組的存取方式,但不做邊界是否越界檢查,訪問效率高
  • at() 進(jìn)行邊界檢查,訪問越界則拋出 exception 效率不容 operator[],這樣開銷比較大,因?yàn)槲覀冇?c++ 主要還是要考慮到效率
vector<wstring> v;
v.reserve(10);

for (size_t i = 0; i < 3; i++) {
        wstringstream wss;
        wss << "[" << i << "]" << endl;
        v.push_back(wss.str());
}
try
{
        wstring wsz = v.at(5);
}
catch (const std::exception& ex)
{
        cout << ex.what() << endl;
}

刪除元素

  • clear 清除整個(gè) vector
  • pop_back:彈出 vector 末尾元素
  • erase: 刪除 vector 中某一位置的元素

使用 erase 來刪除某一個(gè)位置元素,可以指定 iterator 來刪除某一個(gè)元素,也可以通過條件函數(shù)找到 vector 中需要?jiǎng)h除的元素,這里?remove_if?為例說明

vector<string> tuts;
tuts.push_back("machine learning basic tutorial");
tuts.push_back("deep learning basic tutorial");
tuts.push_back("transformer tutorial");

for (int i = 0; i < tuts.size(); i++) {
        cout << tuts[i] << endl;
}

首先我們需要集合來承載這些字符串,這里我選擇了?vector?作為容器,這樣就得到了一個(gè)集合?tuts

vector<string> tuts;
tuts.push_back( "machine learning basic tutorial" );
tuts.push_back("deep learning basic tutorial");
tuts.push_back("transformer tutorial");

for (int i = 0; i < tuts.size(); i++) {
    cout << tuts[i] << endl;
    string::size_type idx;
    idx = tuts[i].find("basic tutorial");

    if (idx == string::npos) {

            cout << "Not Found" << endl;
    }
    else {
            cout << "Found" << endl;
    }
}

這里定義這個(gè)函數(shù) isContainsBasicTut ,這個(gè)代碼是不是讓大家聯(lián)想到 map,這個(gè)函數(shù)通常會(huì)接受一個(gè)數(shù)組元素做輸入,返回一個(gè) bool 類型值,滿足一定條件返回 true

bool isContainsBasicTut(string tutName) {
	string::size_type idx;
	idx = tutName.find("basic tutorial");
	if (idx == string::npos) {

		return false;
	}
	else {
		return true;
	}
}

然后可以調(diào)用?tuts?的?erase?也就是?vector?的刪除方法,這里?remove_if?方法并不會(huì)實(shí)際移除序列中的元素,只是將符合條件元素移動(dòng)到容器末尾并返回指向第一個(gè)移除元素的位置的迭代器,接下來 erase 對(duì) vector 容器中根據(jù)?remove_if?提供的信息來對(duì)元素進(jìn)行清除。

vector<string> tuts;
tuts.push_back( "machine learning basic tutorial" );
tuts.push_back("deep learning basic tutorial");
tuts.push_back("transformer tutorial");

tuts.erase( remove_if(tuts.begin(), tuts.end(), isContainsBasicTut), tuts.end());

for (int i = 0; i < tuts.size(); i++) {
        cout << tuts[i] << endl;
}

接下來我們?cè)偻ㄟ^一例子來看在實(shí)際開發(fā)中如何使用 if_remove

bool isOdd(int num) {
    return ((num % 2) == 1);
}

int main()
{
    vector<int> nums{ 1, 2, 3, 10, 12, 15, 17, 20 };
    remove_if(nums.begin(), nums.end(), isOdd);
    for (vector<int>::iterator it = nums.begin(); it != nums.end(); it++)
            cout << *it << "\t";

    return 0;
}

首先還是定義

原文鏈接:https://juejin.cn/post/7105572360907915277

欄目分類
最近更新