C++相關閑碎記錄(6)

1、使用shared_ptr

#include <iostream>
#include <memory>
#include <set>
#include <deque>
#include <algorithm>
#include <string>class Item {
private:std::string name;float price;
public:Item(const std::string& n, float p = 0) :name(n), price(p) {}std::string getName() const {return name;}void setName(const std::string& n) {name = n;}float getPrice() const {return price;}float setPrice(float p) {price = p;return p;}
};template <typename Coll>
void printItems(const std::string& msg, const Coll& coll) {std::cout << msg << std::endl;for (const auto& elem: coll) {std::cout << " " << elem->getName() << ": " << elem->getPrice() << std::endl;}
}int main() {using namespace std;typedef shared_ptr<Item> ItemPtr;set<ItemPtr> allItems;deque<ItemPtr> bestsellers;bestsellers = {ItemPtr(new Item("Kong Yize", 20.10)),ItemPtr(new Item("A Midsummer Night's Dream", 14.99)),ItemPtr(new Item("The Maltese Falcon", 9.88))};allItems = {ItemPtr(new Item("Water", 0.44)),ItemPtr(new Item("Pizza", 2.22))};allItems.insert(bestsellers.begin(), bestsellers.end());printItems("bestsellers: ", bestsellers);printItems("all: ", allItems);cout << endl;for_each(bestsellers.begin(), bestsellers.end(),[](shared_ptr<Item>& elem) {elem->setPrice(elem->getPrice() * 2);});bestsellers[1] = *(find_if(allItems.begin(), allItems.end(),[](shared_ptr<Item> elem) {return elem->getName() == "Pizza";}));bestsellers[0]->setPrice(44.88);printItems("bestsellers: ", bestsellers);printItems("all: ", allItems);return 0;
}

面的set使用find的時候,會找出擁有相等value的元素,現在卻比較的是內部的指針,

allItems.find(ItemPtr(new Item("Pizza", 2.22)))? ? ?//can't be successful,所以這里必須使用find_if算法。

2、advance

#include <iterator>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;int main()
{list<int> coll;// insert elements from 1 to 9for (int i=1; i<=9; ++i) {coll.push_back(i);}list<int>::iterator pos = coll.begin();// print actual elementcout << *pos << endl;// step three elements forwardadvance (pos, 3);// print actual elementcout << *pos << endl;// step one element backwardadvance (pos, -1);// print actual elementcout << *pos << endl;
}
輸出:
1
4
3

3、iter_swap()

?交換迭代器的值,迭代器類型不必相同,所指的兩個值必須可以相互賦值。

#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
#include "print.hpp"
using namespace std;int main()
{list<int> coll;// insert elements from 1 to 9for (int i=1; i<=9; ++i) {coll.push_back(i);}PRINT_ELEMENTS(coll);// swap first and second valueiter_swap (coll.begin(), next(coll.begin()));PRINT_ELEMENTS(coll);// swap first and last valueiter_swap (coll.begin(), prev(coll.end()));PRINT_ELEMENTS(coll);
}
輸出:
1 2 3 4 5 6 7 8 9 
2 1 3 4 5 6 7 8 9
9 1 3 4 5 6 7 8 2
#include <iterator>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{// create list with elements from 1 to 9vector<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };// find position of element with value 5vector<int>::const_iterator pos;pos = find (coll.cbegin(), coll.cend(),5);// print value to which iterator pos referscout << "pos:  " << *pos << endl;// convert iterator to reverse iterator rposvector<int>::const_reverse_iterator rpos(pos);// print value to which reverse iterator rpos referscout << "rpos: " << *rpos << endl;
}
輸出:
pos:  5
rpos: 4

?

#include <iterator>
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;void print (int elem)
{cout << elem << ' ';
}int main()
{// create deque with elements from 1 to 9deque<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };// find position of element with value 2deque<int>::const_iterator pos1;pos1 = find (coll.cbegin(), coll.cend(),  // range2);                          // value// find position of element with value 7deque<int>::const_iterator pos2;pos2 = find (coll.cbegin(), coll.cend(),  // range7);                          // value// print all elements in range [pos1,pos2)for_each (pos1, pos2,     // rangeprint);         // operationcout << endl;// convert iterators to reverse iteratorsdeque<int>::const_reverse_iterator rpos1(pos1);deque<int>::const_reverse_iterator rpos2(pos2);// print all elements in range [pos1,pos2) in reverse orderfor_each (rpos2, rpos1,   // rangeprint);         // operationcout << endl;
}
輸出:
2 3 4 5 6 
6 5 4 3 2

4、使用base()將reverse迭代器轉回正常

#include <iterator>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;int main()
{// create list with elements from 1 to 9list<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };// find position of element with value 5list<int>::const_iterator pos;pos = find (coll.cbegin(), coll.cend(),  // range5);                          // value// print value of the elementcout << "pos:   " << *pos << endl;// convert iterator to reverse iteratorlist<int>::const_reverse_iterator rpos(pos);// print value of the element to which the reverse iterator referscout << "rpos:  " << *rpos << endl;// convert reverse iterator back to normal iteratorlist<int>::const_iterator rrpos;rrpos = rpos.base();// print value of the element to which the normal iterator referscout << "rrpos: " << *rrpos << endl;
}
輸出:
pos:   5
rpos:  4
rrpos: 5

5、back_inserter

#include <vector>
#include <algorithm>
#include <iterator>
#include "print.hpp"using namespace std;int main() {vector<int> coll;back_insert_iterator<vector<int>> iter(coll);*iter = 1;*iter++;*iter = 2;iter++;*iter = 3;PRINT_ELEMENTS(coll);// convenient wayback_inserter(coll) = 44;back_inserter(coll) = 55;PRINT_ELEMENTS(coll);// use back inserter to append all elements again// - reserve enough memory to avoid reallocationcoll.reserve(2*coll.size());copy(coll.begin(), coll.end(), back_inserter(coll));PRINT_ELEMENTS(coll);return 0;
}
輸出:
1 2 3 
1 2 3 44 55
1 2 3 44 55 1 2 3 44 55

6、front_inserter

#include <list>
#include <algorithm>
#include <iterator>
#include "print.hpp"using namespace std;int main() {list<int> coll;front_insert_iterator<list<int>> iter(coll);*iter = 1;iter++;*iter = 2;iter++;*iter = 3;PRINT_ELEMENTS(coll);front_inserter(coll) = 44;front_inserter(coll) = 55;PRINT_ELEMENTS(coll);copy(coll.begin(), coll.end(), front_inserter(coll));PRINT_ELEMENTS(coll);return 0;
}
輸出:
3 2 1 
55 44 3 2 1
1 2 3 44 55 55 44 3 2 1

7、inserter

#include <set>
#include <list>
#include <algorithm>
#include <iterator>
#include "print.hpp"using namespace std;int main() {set<int> coll;insert_iterator<set<int>> iter(coll, coll.begin());*iter = 1;iter++;*iter = 2;iter++;*iter = 3;PRINT_ELEMENTS(coll,"set: ");inserter(coll, coll.end()) = 44;inserter(coll, coll.end()) = 55;PRINT_ELEMENTS(coll, "set: ");list<int> coll2;copy(coll.begin(), coll.end(), inserter(coll2, coll2.begin()));PRINT_ELEMENTS(coll2, "list: ");copy(coll.begin(), coll.end(), inserter(coll2, ++coll2.begin()));PRINT_ELEMENTS(coll2, "list: ");return 0;
}
輸出:
set: 1 2 3 
set: 1 2 3 44 55
list: 1 2 3 44 55
list: 1 1 2 3 44 55 2 3 44 55

?8、ostream迭代器

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>using namespace std;int main() {ostream_iterator<int> intWriter(cout, "\n");*intWriter = 43;intWriter++;*intWriter = 77;intWriter++;*intWriter = -5;vector<int> coll = {1, 2, 3, 4, 5, 6, 7, 8, 9};copy(coll.begin(), coll.end(), ostream_iterator<int>(cout));cout << endl;copy(coll.begin(), coll.end(), ostream_iterator<int>(cout, " < "));cout << endl;return 0;
}
輸出:
43
77
-5
123456789
1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 <

?9、istream迭代器

#include <iterator>
#include <iostream>
#include <string>
#include <algorithm>using namespace std;int main() {istream_iterator<string> cinPos(cin);ostream_iterator<string> coutPos(cout, " ");while (cinPos != istream_iterator<string>()) {advance(cinPos, 2);if (cinPos != istream_iterator<string>()) {*coutPos++ = *cinPos++;}}cout << endl;return 0;
}
輸入:
No one objects if you are doing
a good programming job for 
someone whom you respect
輸出:
objects are good for you

10、move迭代器

std::vector<string> v2(make_move_iterator(s.begin()),make_move_iterator(s.end()));

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210720.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Centos】

一、Virtualbox安裝Centos 1、Virtualbox 下載地址: Virtualbox 2、Centos 下載地址: Centos 3、Virtualbox安裝Centos教程 Virtualbox安裝Centos教程: Virtualbox安裝Centos教程

光學遙感顯著目標檢測初探筆記總結

目錄 觀看地址介紹什么是顯著性目標檢測根據不同的輸入會有不同的變體(顯著性目標檢測家族)目前這個領域的挑戰 技術方案論文1(2019)論文2(2021)論文3(2022) 未來展望 觀看地址 b站鏈接 介紹 什么是顯著性目標檢測 一張圖片里最吸引注意力的部分就是顯著性物體&#xff0c;…

vue3 vue-router 導航守衛 (五)

在Vue 3中&#xff0c;導航守衛仍然是一個重要的概念&#xff0c;用于在路由切換時執行一些特定的邏輯。Vue Router提供了多個導航守衛&#xff0c;包括全局守衛、路由獨享守衛和組件內守衛。可以在路由切換時執行一些特定的邏輯&#xff0c;例如身份驗證、權限控制、數據加載等…

C++STL詳解+代碼分析+典例講解

vector 的介紹&#xff1a; 1、vector是表示可變大小數組的序列容器。 2、vector就像數組一樣&#xff0c;也采用的連續空間來存儲元素&#xff0c;這也意味著可以采用下標對vector的元素進行訪問。 3、vector與普通數組不同的是&#xff0c;vector的大小是可以動態改變的。 4、…

基于物聯網的智能倉管理系統方案

基于物聯網的智能倉管理系統方案 一、項目背景 隨著企業業務的快速發展&#xff0c;傳統的人工倉庫管理方式已經無法滿足現代企業的需求。倉庫運營效率低下、貨物出入庫錯誤、庫存不準確等問題不斷涌現。因此&#xff0c;我們提出一個基于物聯網技術的智能倉管理系統方案&…

Redis 五大經典業務問題

一 緩存穿透 緩存穿透是指當請求的數據既不在緩存中也不存在于數據庫中時&#xff0c;請求會直接穿透緩存層&#xff0c;到達數據庫層。這通常是由于惡意攻擊或者程序錯誤造成的&#xff0c;比如攻擊者故意請求不存在的大量數據&#xff0c;導致緩存不命中&#xff0c;所有的請…

智能優化算法應用:基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.被囊群算法4.實驗參數設定5.算法結果6.參考文…

Moco框架的搭建使用

一、前言   之前一直聽mock&#xff0c;也大致了解mock的作用&#xff0c;但沒有具體去了解過如何用工具或框架實現mock&#xff0c;以及也沒有考慮過落實mock&#xff0c;因為在實際的工作中&#xff0c;很少會考慮用mock。最近在學java&#xff0c;剛好了解到moco框架是用于…

城市基礎設施智慧路燈改造的特點

智慧城市建設穩步有序推進。作為智慧城市的基礎設施&#xff0c;智能照明是智慧城市的重要組成部分&#xff0c;而叁仟智慧路燈是智慧城市理念下的新產品。隨著物聯網和智能控制技術的飛速發展&#xff0c;路燈被賦予了新的任務和角色。除了使道路照明智能化和節能化外&#xf…

安全掃描五項簡介

目錄 安掃五項 1.代碼檢測 2.主機基線 nginx合規檢查 麒麟基線 3.WEB掃描 4.滲透測試 用戶枚舉漏洞 漏洞描述 修復建議 點擊劫持漏洞 漏洞描述 修復建議 XSS漏洞 漏洞描述 修復建議 3.主機漏洞 超高危漏洞 高危漏洞 中危漏洞 低危漏洞 信息漏洞 參考信息…

用電商API接口獲取拼多多的商品詳情數據

pinduoduo.item_get_app_pro-根據ID取商品詳情原數據 公共參數 API請求地址 名稱類型必須描述keyString是調用key&#xff08;必須以GET方式拼接在URL中&#xff09;secretString是調用密鑰api_nameString是API接口名稱&#xff08;包括在請求地址中&#xff09;[item_searc…

一步一步寫線程之一簡單的開始

一、多線程 多線程不管是在前面的文章分析中還是在網上還是大書籍上&#xff0c;學習C/C多線程編程是無法繞過的&#xff0c;即使使用別人封裝好的框架&#xff0c;包括使用STL的一些庫&#xff0c;如果僅僅是簡單的應用&#xff0c;可能也就過去了。不過&#xff0c;稍微復雜…

VBA_MF系列技術資料1-237

MF系列VBA技術資料 為了讓廣大學員在VBA編程中有切實可行的思路及有效的提高自己的編程技巧&#xff0c;我參考大量的資料&#xff0c;并結合自己的經驗總結了這份MF系列VBA技術綜合資料&#xff0c;而且開放源碼&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04屬于定…

[Linux] 用LNMP網站框架搭建論壇

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守護進程 它是php.ini是一個php解析器 工作過程&#xff1a; 1.當客戶端通過域名請求訪問時&#xff0c;Nginx會找到對應的虛擬主機 2. Nginx將確定請求。 對于靜態請求&#xff0c;Nginx會自行處理…

結構體和位段

結構體&#xff1a; C語言中&#xff0c;我們之前使用的都是C語言中內置的類型&#xff0c;比如整形&#xff08;int&#xff09;、字符型&#xff08;char&#xff09;、單精度浮點型&#xff08;float&#xff09;等。但是我們知道&#xff0c;我們現實世界中&#xff0c;還…

聊聊spring.mvc.servlet.load-on-startup

序 本文主要研究一下spring.mvc.servlet.load-on-startup spring.mvc.servlet.load-on-startup org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java ConfigurationProperties(prefix "spring.mvc") public class WebMvcProperties {//.…

json精講

本文介紹json的規范及javascript和java對數據的交換讀取 1. json介紹1.1 json簡介1.2為什么使用 JSON&#xff1f; 2. json規范2.1基礎規范2.2 key值為-字符串、數字、布爾值2.3 key值為對象Object2.4 key值為數組2.5 json本身就是一個數組 3.javascript操作json3.1 javascript…

WPF(Windows Presentation Foundation) 的 Menu控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 Menu 是一種用于創建菜單的控件。菜單通常位于應用程序窗口的頂部&#xff0c;并提供了一組命令或選項&#xff0c;用于導航到不同的功能區域、執行特定的操作或訪問特定的功能。 Menu 控件是 WPF 中的一個容器…

2、關于使用ajax驗證繞過(實例2)

ajax原理我上一篇有寫過&#xff0c;參考&#xff1a;1、關于前端js-ajax繞過-CSDN博客 一、實例環境&#xff1a; 為手機上的某一割韭菜app 二、目的&#xff1a; 實現繞過手機驗證碼&#xff0c;找回密碼 三、工具&#xff1a; bp代理 四、驗證步驟如下&#xff1a; …

ECU安全學習網站和書籍介紹

ECU安全是指關注和保護汽車電子控制單元&#xff08;ECU&#xff09;的安全性和防護措施。ECU是現代汽車中的關鍵組件&#xff0c;它負責監控和控制車輛各種系統的運行&#xff0c;如發動機、制動、轉向等。ECU安全的重要性在于防止惡意攻擊者操控或干擾車輛的操作。 ECU安全涉…