leetcode76

目錄

803ms超時。。。。越改越超時。。。

一些糾纏

代碼分析:

代碼問題:

改進建議:

示例代碼:

The error message you’re seeing indicates that there is a reference binding to a null pointer in your code. This typically happens when you try to access an element of a vector that has not been initialized or has been moved from.

問題分析:

修正后的代碼:

解釋:

c_++可以在函數里定義函數嗎

int& a;int &a;int & a;int&a;還有int* a四種形式。哪些是對的

解釋:

注意事項:

示例:

int*a,int * a,int* a,int *a哪些是對的

解釋:

注意事項:

示例:

bool check() { for (const auto &p: ori) { if (cnt[p.first] < p.second) { return false; } } return true; } 。這邊可以寫成p->first嗎

.和->在什么時候使用

.運算符(點運算符):

->運算符(箭頭運算符):

比較:

注意事項:

示例:使用迭代器

bool check() { for (const auto &p: ori) { if (cnt[p.first] < p.second) { return false; } } return true; } const能刪去嗎

如果可以刪除?const?的情況:

保留?const?的好處:

示例:

結論:

--c++-------------------------

?

1. 使用迭代器

2. 使用基于范圍的for循環(C++11及以后)

3. 使用C++17結構化綁定(C++17及以后)

4. 使用std::for_each算法

1. 使用clear()成員函數

2. 使用迭代器手動刪除

3. 賦值一個空map

4. 使用swap()方法


803ms超時。。。。越改越超時。。。

class Solution {
public:// //題解說封裝
// bool check(int l,int r)
// {// }string minWindow(string s, string t) {int ls=s.size();int lt=t.size();if(ls<lt)return "";if(s==t)return t;vector<int> hilight;unordered_map<char,int> mp;unordered_map<char,int> mp1;for(int i =0;i<lt;i++)mp[t[i]]++;for(int i =0;i<ls;i++)if(mp[s[i]])hilight.push_back(i);if(hilight.empty()) return "";int left=0;int right=0;mp1[s[hilight[0]]]=1;int len=ls;int ansl,ansr;int F=0;while(left<=right&&right<hilight.size()){// for(int i=left;i<=right;i++)mp1[s[hilight[i]]]++;int flag=0;for(auto it=mp.begin();it!=mp.end();it++)if(it->second>mp1[it->first]){flag=1;right++;if(left<=right&&right<hilight.size())mp1[s[hilight[right]]]++;break;}if(!flag){cout<<"left:"<<left<<"right:"<<right<<endl;if(len>=hilight[right]-hilight[left]+1){F=1;len=hilight[right]-hilight[left]+1;ansl=hilight[left];ansr=hilight[right];cout<<"len:"<<len<<endl;}  mp1[s[hilight[left]]]--;left++;}//mp1.clear();}cout<<ansl<<ansr;if(F)return s.substr(ansl,ansr-ansl+1);else return "";}
};

我啥也沒動啊,吧改的部分刪了,又過了。。

class Solution {
public:// //題解說封裝
// bool check(int l,int r)
// {// }string minWindow(string s, string t) {int ls=s.size();int lt=t.size();if(ls<lt)return "";if(s==t)return t;vector<int> hilight;unordered_map<char,int> mp;unordered_map<char,int> mp1;for(int i =0;i<lt;i++)mp[t[i]]++;for(int i =0;i<ls;i++)if(mp[s[i]])hilight.push_back(i);if(hilight.empty()) return "";int left=0;int right=0;mp1[s[hilight[0]]]=1;int len=ls;int ansl,ansr;int F=0;while(left<=right&&right<hilight.size()){// for(int i=left;i<=right;i++)mp1[s[hilight[i]]]++;int flag=0;for(auto it=mp.begin();it!=mp.end();it++)if(it->second>mp1[it->first]){flag=1;right++;if(left<=right&&right<hilight.size())mp1[s[hilight[right]]]++;break;}if(!flag){//if(hilight[right]-lt<(hilight[left]+hilight[right])/2)//{if(len>=hilight[right]-hilight[left]+1){F=1;len=hilight[right]-hilight[left]+1;ansl=hilight[left];ansr=hilight[right];cout<<"len:"<<len<<endl;}  mp1[s[hilight[left]]]--;left++;}}if(F)return s.substr(ansl,ansr-ansl+1);else return "";}//mp1.clear();};

因為我刪除了cout節省了時間???

這是官方題解,時間復雜度和我都是O(N),合理懷疑是我的變量太多了,設置高亮標記反而不如老老實實一步步走。。

class Solution {
public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const auto &c: t) {++ori[c];}int l = 0, r = -1;int len = INT_MAX, ansL = -1, ansR = -1;while (r < int(s.size())) {if (ori.find(s[++r]) != ori.end()) {++cnt[s[r]];}while (check() && l <= r) {if (r - l + 1 < len) {len = r - l + 1;ansL = l;}if (ori.find(s[l]) != ori.end()) {--cnt[s[l]];}++l;}}return ansL == -1 ? string() : s.substr(ansL, len);}
};作者:力扣官方題解
鏈接:https://leetcode.cn/problems/minimum-window-substring/solutions/257359/zui-xiao-fu-gai-zi-chuan-by-leetcode-solution/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

官方用時116ms,我357ms,是他的三倍/

一些糾纏

class Solution { public: string minWindow(string s, string t) { int ls=s.size();int lt=t.size(); if(ls<lt)return "";if(s==t)return t; vector<int> hilight; unordered_map<char,int> mp;unordered_map<char,int> mp1; for(int i =0;i<lt;i++)mp[t[i]]++; for(int i =0;i<ls;i++)if(mp[s[i]])hilight.push_back(i); int left=0;int right=0;int len=ls;int ansl,ansr;int F=0; while(left<=right&&right<hilight.size()) { for(int i=left;i<=right;i++)mp1[s[hilight[i]]]++; int flag=0; for(auto it=mp.begin();it!=mp.end();it++) if(it->second>mp1[it->first]){flag=1;right++; if(left<=right&&right<hilight.size())mp1[s[hilight[right]]]++; break;} if(!flag) { cout<<"left:"<<left<<"right:"<<right<<endl; if(len>=hilight[right]-hilight[left]+1) {F=1;len=hilight[right]-hilight[left]+1;ansl=hilight[left];ansr=hilight[right];} mp1[s[hilight[left]]]--;left++; } //mp1.clear(); }cout<<ansl<<ansr; if(F)return s.substr(ansl,ansr-ansl+1);else return ""; } };這個結果為什么不對

復制入框

ChatGLM

你的代碼目的是找到字符串?s?中包含字符串?t?所有字符的最小窗口。但是代碼中存在一些邏輯錯誤和可能的優化點。以下是對代碼的分析和改進建議:

代碼分析:

  1. 初始化和邊界條件

    • 你正確地處理了?s?的長度小于?t?的情況和?s?等于?t?的情況。
  2. 字符頻率統計

    • 你使用?mp?來統計?t?中每個字符的出現次數,這是正確的。
  3. 高亮索引

    • 你創建了一個?hilight?數組來存儲?s?中所有在?t?中出現的字符的索引。這個思路是可行的,但需要注意后續處理。
  4. 滑動窗口

    • 你使用兩個指針?left?和?right?來表示當前窗口的邊界。但是,你的窗口調整邏輯存在一些問題。
  5. 窗口有效性檢查

    • 你在每次擴展窗口后檢查窗口是否包含?t?的所有字符。這個檢查是必要的,但是實現方式可以優化。

代碼問題:

  1. 窗口調整邏輯

    • 在擴展窗口時,你只增加了?right?指針,但沒有正確地處理?left?指針的移動。
    • 當找到一個有效窗口后,你應該嘗試收縮窗口(移動?left?指針),以找到更小的有效窗口。
  2. 字符頻率比較

    • 你在比較?mp?和?mp1?時,如果發現窗口不包含所有字符,就只增加了?right?指針。但是,這樣做可能會導致一些字符的數量超過?t?中的數量,從而影響結果的準確性。
  3. 輸出和返回值

    • 你在代碼中使用了?cout?來輸出中間結果,這有助于調試,但最終代碼中應該去掉這些輸出。

改進建議:

  1. 優化窗口調整邏輯

    • 在找到一個有效窗口后,嘗試收縮窗口,直到窗口不再有效為止。
  2. 精確控制字符頻率

    • 確保窗口中的字符頻率與?t?中的字符頻率完全匹配。
  3. 去除調試輸出

    • 最終代碼中不應包含?cout?輸出。

示例代碼:

以下是改進后的代碼示例:

cpp

復制

class Solution {
public:string minWindow(string s, string t) {if (s.size() < t.size()) return "";if (s == t) return t;unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0, valid = 0;int start = 0, length = INT_MAX;while (right < s.size()) {char c = s[right];right++;if (need.count(c)) {window[c]++;if (window[c] == need[c]) valid++;}while (valid == need.size()) {if (right - left < length) {start = left;length = right - left;}char d = s[left];left++;if (need.count(d)) {if (window[d] == need[d]) valid--;window[d]--;}}}return length == INT_MAX ? "" : s.substr(start, length);}
};

這個改進后的代碼使用了一個更標準的滑動窗口 approach,并且確保了窗口中的字符頻率與?t?中的字符頻率完全匹配。同時,去除了調試輸出,使代碼更符合生產環境的要求。

用戶_uBiEPA

Line 1122: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_vector.h:1131:9這是什么

ChatGLM

The error message you’re seeing indicates that there is a reference binding to a null pointer in your code. This typically happens when you try to access an element of a vector that has not been initialized or has been moved from.

Let’s analyze the code snippet you provided and identify potential issues:

cpp

復制

class Solution {
public:string minWind

本次回答已被終止

用戶_uBiEPA

中文

ChatGLM

你遇到的錯誤信息 “runtime error: reference binding to null pointer of type ‘int’” 指出你的代碼中存在空指針引用綁定的問題。這通常發生在你嘗試訪問一個未初始化或已被移動的向量的元素時。

讓我們分析你提供的代碼片段并找出潛在的問題:

cpp

復制

class Solution 
public:string minWindow(string s, string t) {int ls = s.size();int lt = t.size();if (ls < lt) return "";if (s == t) return t;vector<int> hilight;unordered_map<char, int> mp;unordered_map<char, int> mp1;for (int i = 0; i < lt; i++) mp[t[i]]++;for (int i = 0; i < ls; i++) if (mp.count(s[i])) hilight.push_back(i);if (hilight.empty()) return "";int left = 0, right = 0;int len = INT_MAX;int ansl = 0, ansr = 0;bool F = false;while (right < hilight.size()) {mp1[s[hilight[right]]]++;while (check(mp, mp1)) {if (len > hilight[right] - hilight[left] + 1) {len = hilight[right] - hilight[left] + 1;ansl = hilight[left];ansr = hilight[right];F = true;}mp1[s[hilight[left]]]--;left++;}right++;}cout << ansl << " " << ansr << endl;if (F) return s.substr(ansl, ansr - ansl + 1);else return "";}bool check(unordered_map<char, int> mp, unordered_map<char, int> mp1) {for (auto it : mp) {if (mp1[it.first] < it.second) return false;}return true;}

問題分析:

  1. 未初始化的變量

    • int ls = s.size();?和?int lt = t.size();?這兩行代碼中,變量?ls?和?lt?的初始化是正確的,但你在后續的?for?循環中使用了未初始化的變量?i。這可能會導致未定義行為。
  2. 未定義的變量

    • 在?for (int i = 0; i < lt; i++) mp[t[i]]++;?這行代碼中,i?未被正確初始化。你應該使用?int i = 0;
  3. 未定義的函數

    • check?函數未定義在類?Solution?中。你需要將其定義為?Solution?類的成員函數。
  4. 未定義的變量

    • F1?未在代碼中定義和使用。

修正后的代碼:

cpp

復制

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <climits>using namespace std;class Solution {
public:string minWindow(string s, string t) {int ls = s.size();int lt = t.size();if (ls < lt) return "";if (s == t) return t;vector<int> hilight;unordered_map<char, int> mp;unordered_map<char, int> mp1;for (int i = 0; i < lt; i++) mp[t[i]]++;for (int i = 0; i < ls; i++) if (mp.count(s[i])) hilight.push_back(i);if (hilight.empty()) return "";int left = 0, right = 0;int len = INT_MAX;int ansl = 0, ansr = 0;bool F = false;while (right < hilight.size()) {mp1[s[hilight[right]]]++;while (check(mp, mp1)) {if (len > hilight[right] - hilight[left] + 1) {len = hilight[right] - hilight[left] + 1;ansl = hilight[left];ansr = hilight[right];F = true;}mp1[s[hilight[left]]]--;left++;}right++;}if (F) return s.substr(ansl, ansr - ansl + 1);else return "";}bool check(unordered_map<char, int> mp, unordered_map<char, int> mp1) {for (auto it : mp) {if (mp1[it.first] < it.second) return false;}return true;}
};int main() {Solution solution;string s = "ADOBECODEBANC";string t = "ABC";cout << solution.minWindow(s, t) << endl;return 0;
}

解釋:

  1. 初始化變量

    • 確保所有變量在使用前都已正確初始化。
  2. 定義?check?函數

    • 將?check?函數定義為?Solution?類的成員函數。
  3. 修復未定義的變量

    • 移除未定義的變量?F1
  4. 主函數

    • 添加一個主函數來測試?minWindow?函數。

通過這些修正,代碼應該能夠正確運行并找到包含字符串?t?所有字符的最小窗口。

用戶_uBiEPA

c_++可以在函數里定義函數嗎

ChatGLM

C++ 不允許在函數內部定義另一個函數。在C++中,函數必須定義在全局作用域、命名空間作用域或類作用域中,而不能定義在另一個函數的內部。如果你嘗試在函數內部定義另一個函數,編譯器將會報錯。

例如,以下代碼將會導致編譯錯誤:

cpp

復制

void outerFunction() {void innerFunction() { // 錯誤:不能在函數內部定義另一個函數// 函數體}
}

如果你需要在函數內部創建類似于函數的行為,可以考慮以下替代方案:

  1. 使用lambda表達式:C++11及以后的版本支持lambda表達式,它允許你在函數內部定義匿名函數。

cpp

復制

void outerFunction() {auto lambda = []() {// Lambda函數體};lambda(); // 調用lambda表達式
}
  1. 定義函數對象:你可以創建一個類,并在該類中重載()`運算符,從而創建一個函數對象。

cpp

復制

class Functor {
public:void operator()() {// 函數體}
};void outerFunction() {Functor functor;functor(); // 調用函數對象
}
  1. 將函數定義在類中:如果你在類中定義成員函數,那么這些函數將屬于類的作用域,而不是另一個函數的作用域。

cpp

復制

class MyClass {
public:void outerFunction() {innerFunction(); // 調用成員函數}private:void innerFunction() {// 函數體}
};

選擇哪種替代方案取決于你的具體需求和代碼風格。在現代C++中,lambda表達式通常是實現這種功能的最便捷方式。

用戶_uBiEPA

int& a;int &a;int & a;int&a;還有int* a四種形式。哪些是對的

ChatGLM

在C++中,關于引用和指針的聲明,你提到的幾種形式中,大部分是正確的,但有一些細節需要注意。以下是每種形式的解釋:

  1. int& a;
  2. int &a;
  3. int & a;
  4. int&a;
  5. int* a

解釋:

  1. int& a;

    • 這是正確的。它聲明了一個名為?a?的引用,該引用必須初始化為某個整數的引用。
  2. int &a;

    • 這也是正確的。在C++中,int?和?&?之間的空格是可選的,所以這種寫法與第一種相同。
  3. int & a;

    • 這也是正確的。在?&?和變量名?a?之間的空格是可選的,所以這種寫法與前兩種相同。
  4. int&a;

    • 這也是正確的。它是一種緊湊的寫法,沒有空格,但仍然是有效的C++語法。
  5. int* a

    • 這是正確的。它聲明了一個名為?a?的指針,該指針可以指向一個整數。

注意事項:

  • 引用必須在聲明時初始化,例如:int& a = someInt;
  • 指針可以在聲明時不初始化,例如:int* a;,但使用前應確保它指向一個有效的內存地址。

示例:

cpp

復制

int main() {int x = 10;int& a = x; // 正確int &b = x; // 正確int & c = x; // 正確int&d = x; // 正確int* e; // 正確,但未初始化// 使用引用a = 20;std::cout << x << std::endl; // 輸出 20// 使用指針e = &x;*e = 30;std::cout << x << std::endl; // 輸出 30return 0;
}

在這個示例中,所有提到的聲明形式都是正確的,并且展示了如何使用引用和指針來修改變量的值。

用戶_uBiEPA

int*a,int * a,int* a,int *a哪些是對的

ChatGLM

在C++中,關于指針的聲明,你提到的幾種形式中,大部分是正確的,但有一些細節需要注意。以下是每種形式的解釋:

  1. int *a;
  2. int * a;
  3. int* a;
  4. int *a

解釋:

  1. int *a;

    • 這是正確的。它聲明了一個名為?a?的指針,該指針可以指向一個整數。
  2. int * a;

    • 這也是正確的。在?*?和變量名?a?之間的空格是可選的,所以這種寫法與第一種相同。
  3. int* a;

    • 這也是正確的。在?int?和?*?之間的空格是可選的,所以這種寫法與第一種相同。
  4. int *a

    • 這是不正確的。在?int?和?*?之間缺少空格,會導致編譯器無法正確解析聲明。

注意事項:

  • 在C++中,指針聲明時?*?和變量名之間的空格是可選的,但類型名和?*?之間的空格是必須的。
  • 指針可以在聲明時不初始化,例如:int *a;,但使用前應確保它指向一個有效的內存地址。

示例:

cpp

復制

#include <iostream>int main() {int x = 10;int *a;        // 正確int * b;       // 正確int* c;        // 正確// int *d;     // 錯誤a = &x;        // 指針 a 指向 x*a = 20;       // 通過指針 a 修改變量 x 的值std::cout << x << std::endl; // 輸出 20return 0;
}

在這個示例中,所有正確的聲明形式都展示了如何使用指針來修改變量的值。注意,最后一個聲明?int *d?是錯誤的,因為缺少了空格。

用戶_uBiEPA

bool check() { for (const auto &p: ori) { if (cnt[p.first] < p.second) { return false; } } return true; } 。這邊可以寫成p->first嗎

ChatGLM

在你提供的代碼片段中,p?是通過?for?循環從?ori?中迭代出來的,其中?ori?很可能是一個?std::map?或?std::unordered_map?的實例。在這種情況下,p?是一個?std::pair<const KeyType, ValueType>?類型的對象,而不是指針。

因此,你不能使用?p->first,因為?->?運算符是用于指針的,用于訪問指針所指向對象的成員。對于非指針類型,你應該使用?.?運算符來訪問成員。

所以,你的代碼中的?p.first?是正確的,而?p->first?是錯誤的。

正確的代碼應該是:

cpp

復制

bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;
}

如果你確實需要使用?->?運算符,那么?p?必須是一個指向?std::pair?的指針。例如,如果?ori?是一個?std::vector<std::pair<KeyType, ValueType>*>,那么你可以這樣寫:

cpp

復制

bool check() {for (const auto *p: ori) { // 注意這里的 *p,表示 p 是一個指針if (cnt[p->first] < p->second) {return false;}}return true;
}

但根據你的原始代碼,p?顯然不是指針,所以使用?p.first?是正確的。

用戶_uBiEPA

bool check() { for (const auto &p: ori) { if (cnt[p.first] < p.second) { return false; } } return true; } 。這邊可以寫成p->first嗎,我告訴你ori是map

ChatGLM

不可以。即使?ori?是?map,你在循環中使用的?p?依然不是指針,而是一個對?pair?的引用。在 C++ 中,map?的迭代器解引用后得到的是一個?pair?對象,而不是指針。因此,你應該使用?.?運算符來訪問?pair?的成員。

你的原始代碼是正確的:

cpp

復制

bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;
}

在這段代碼中,p?是一個對?pair<const KeyType, ValueType>?的引用,所以你應該使用?p.first?和?p.second?來訪問?pair?的成員。

如果你堅持要使用?->?運算符,你需要在循環中顯式地獲取指針,但這通常是不必要的且會使代碼更復雜。例如:

cpp

復制

bool check() {for (const auto *p_ptr = ori.begin(); p_ptr != ori.end(); ++p_ptr) {if (cnt[p_ptr->first] < p_ptr->second) {return false;}}return true;
}

在這個例子中,p_ptr?是一個指向?pair<const KeyType, ValueType>?的指針,所以你可以使用?p_ptr->first?和?p_ptr->second。但是,這種寫法不如你的原始代碼簡潔和直觀。

總結:對于?map?的迭代,使用?.?運算符來訪問?pair?的成員是更標準、更簡潔的方式。

用戶_uBiEPA

.和->在什么時候使用

ChatGLM

在C++中,.->都是用來訪問對象成員的運算符,但它們的使用場景有所不同:

.運算符(點運算符):

  • 使用場景:當直接訪問一個對象或對象的引用時使用。
  • 語法對象.成員?或?引用.成員
  • 示例

    cpp

    復制

    MyClass obj;
    obj.memberFunction();  // 調用對象的方法
    obj.memberVariable = 10;  // 訪問對象的成員變量
    

->運算符(箭頭運算符):

  • 使用場景:當通過一個指向對象的指針來訪問對象的成員時使用。
  • 語法指針->成員
  • 示例

    cpp

    復制

    MyClass* ptr = new MyClass();
    ptr->memberFunction();  // 通過指針調用對象的方法
    ptr->memberVariable = 10;  // 通過指針訪問對象的成員變量
    

比較:

  • 對象本身:使用.運算符。
  • 對象指針:使用->運算符。

注意事項:

  • 引用:對于引用,即使它是對象的別名,也使用.運算符,因為引用在語法上被視為對象本身。
  • 迭代器:在STL中,迭代器在某些操作上表現得像指針,但在訪問成員時,通常使用.運算符,除非迭代器本身是一個指針類型。

示例:使用迭代器

cpp

復制

std::map<int, int> myMap;
for (const auto& pair : myMap) {// 使用.運算符,因為pair是一個引用std::cout << pair.first << " " << pair.second << std::endl;
}for (auto it = myMap.begin(); it != myMap.end(); ++it) {// 使用->運算符,因為it是一個指針-like的迭代器std::cout << it->first << " " << it->second << std::endl;
}

在這個示例中,pair?是一個對?std::pair<const int, int>?的引用,所以使用.運算符。而?it?是一個迭代器,它在語法上表現得像指針,所以使用->運算符。

總之,選擇.還是->取決于你是在直接操作對象還是通過指針操作對象。在大多數情況下,使用.運算符會使代碼更清晰,除非你確實需要通過指針來訪問成員。

用戶_uBiEPA

bool check() { for (const auto &p: ori) { if (cnt[p.first] < p.second) { return false; } } return true; } const能刪去嗎

ChatGLM

引用

在這個特定的函數中,const?關鍵字用于修飾循環中的?auto?類型推導,確保?p?是一個常量引用。這表示在循環體中,p?所引用的元素不會被修改。關于是否可以刪除?const,這取決于你的意圖和?ori?的使用場景。

如果可以刪除?const?的情況:

  1. 不修改?p:如果你在循環中確實沒有修改?p,并且保證將來也不會修改?p,那么從技術上來說,const?是可以刪除的。這不會影響函數的功能。

保留?const?的好處:

  1. 明確意圖const?使得代碼的意圖更清晰,即表明你不會修改?p?所引用的元素。這有助于其他開發者理解代碼,也減少了未來不小心修改?p?的風險。
  2. 兼容性:如果?ori?的類型是?const?的,例如?const std::map<Key, Value>,那么使用?const auto &p?是必要的,否則會導致編譯錯誤。

示例:

不使用?const

cpp

復制

bool check() {for (auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;
}

使用?const

cpp

復制

bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;
}

結論:

  • 如果你想明確表示不會修改?p,并且希望代碼更加健壯和易于理解,建議保留?const
  • 如果你有充分的理由相信?const?是多余的,并且確保將來不會修改?p,可以刪除?const

在實際開發中,通常建議盡可能使用?const?來提供額外的安全保障和清晰度。除非有特定的性能考慮或代碼風格要求,否則保留?const?是更穩妥的選擇。

--c++-------------------------

在C++中,std::sort?函數用于對容器(如?std::vector)中的元素進行排序。std::sort?函數并不返回一個新的排序好的數組,而是直接在原容器上進行排序,即原地排序(in-place sorting)。

當你調用?std::sort?函數時,你傳遞給它的容器會被直接修改,元素會按照指定的排序準則(默認是從小到大)進行排序。如果你需要保留原始容器的順序,你需要在排序之前復制一份容器。

下面是一個使用?std::sort?對?std::vector?進行排序的示例:

cpp

復制

#include <iostream>
#include <vector>
#include <algorithm> // for std::sortint main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};// 對vec進行排序std::sort(vec.begin(), vec.end());// 打印排序后的vecfor (int num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在這個例子中,vec?會被直接排序,而不是返回一個新的排序好的數組。排序后的結果會反映在原?vec?容器中。

如果你需要返回一個排序好的新容器而不修改原容器,你可以先復制原容器,然后對副本進行排序:

cpp

復制

#include <iostream>
#include <vector>
#include <algorithm> // for std::sortint main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};std::vector<int> sorted_vec = vec; // 復制vec// 對sorted_vec進行排序std::sort(sorted_vec.begin(), sorted_vec.end());// 打印原始的vecstd::cout << "Original vec: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;// 打印排序后的sorted_vecstd::cout << "Sorted vec: ";for (int num : sorted_vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在這個例子中,sorted_vec?是?vec?的一個副本,它被排序后,原始的?vec?保持不變。

訪客_693bf2

如何遍歷一個map

ChatGLM

在C++中,std::map?是一個關聯容器,它存儲元素的方式是基于鍵(key)的有序集合。每個元素都有一個鍵和一個與之相關聯的值(value)。要遍歷?std::map,你可以使用多種方法。以下是幾種常見的遍歷?std::map?的方法:

1. 使用迭代器

迭代器是遍歷容器的常用方法。std::map?提供了迭代器來遍歷其元素。

cpp

復制

#include <iostream>
#include <map>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 使用迭代器遍歷mapfor (auto it = myMap.begin(); it != myMap.end(); ++it) {std::cout << it->first << " => " << it->second << std::endl;}return 0;
}

2. 使用基于范圍的for循環(C++11及以后)

C++11引入了基于范圍的for循環,這使得遍歷容器變得更加簡潔。

cpp

復制

#include <iostream>
#include <map>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 使用基于范圍的for循環遍歷mapfor (const auto& pair : myMap) {std::cout << pair.first << " => " << pair.second << std::endl;}return 0;
}

3. 使用C++17結構化綁定(C++17及以后)

C++17引入了結構化綁定,這使得你可以直接綁定鍵和值。

cpp

復制

#include <iostream>
#include <map>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 使用結構化綁定遍歷mapfor (const auto& [key, value] : myMap) {std::cout << key << " => " << value << std::endl;}return 0;
}

4. 使用std::for_each算法

你也可以使用?std::for_each?算法來遍歷?std::map

cpp

復制

#include <iostream>
#include <map>
#include <algorithm>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 使用std::for_each遍歷mapstd::for_each(myMap.begin(), myMap.end(), [](const std::pair<int, std::string>& pair) {std::cout << pair.first << " => " << pair.second << std::endl;});return 0;
}

這些方法都可以有效地遍歷?std::map?中的元素。選擇哪種方法取決于你的個人偏好和具體需求。

訪客_693bf2

如何清空一個map

ChatGLM

引用

在C++中,清空一個std::map可以使用幾種不同的方法,以下是幾種常見的方式:

1. 使用clear()成員函數

clear()std::map的一個成員函數,它可以移除所有元素,使容器的大小變為0。

cpp

復制

#include <map>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 清空mapmyMap.clear();// 現在 myMap 為空return 0;
}

2. 使用迭代器手動刪除

雖然不常用,但你也可以通過迭代器手動刪除std::map中的所有元素。

cpp

復制

#include <map>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 使用迭代器手動刪除所有元素for (auto it = myMap.begin(); it != myMap.end(); ) {it = myMap.erase(it);}// 現在 myMap 為空return 0;
}

3. 賦值一個空map

你可以通過賦值操作將一個空map賦給現有的map對象,這樣也可以清空map。

cpp

復制

#include <map>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 賦值一個空mapmyMap = std::map<int, std::string>();// 現在 myMap 為空return 0;
}

4. 使用swap()方法

使用swap()方法與一個空map交換內容,也可以達到清空的目的。

cpp

復制

#include <map>int main() {std::map<int, std::string> myMap;// 填充mapmyMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 使用swap與一個空map交換內容std::map<int, std::string>().swap(myMap);// 現在 myMap 為空return 0;
}

以上方法都可以有效地清空一個std::map。最常用和推薦的方法是使用clear()成員函數,因為它直接且清晰地表達了清空容器的意圖。

未完代碼存檔

class Solution {
public:unordered_map<char,int> mp;unordered_map<char,int> mp1;// //題解說封裝
bool check()
{
for(const auto & p:mp)if(p.second>mp1[p.first])return false;
return true;
}string minWindow(string s, string t) {int ls=s.size();int lt=t.size();if(ls<lt)return "";if(s==t)return t;//vector<int> hilight;for(int i =0;i<lt;i++)mp[t[i]]++;// for(int i =0;i<ls;i++)if(mp[s[i]])hilight.push_back(i);// if(hilight.empty()) return "";int left=0;int right=0;mp1[s[0]]=1;int len=ls;int ansl,ansr;int F=0;while(left<=right&&right<ls){// for(int i=left;i<=right;i++)mp1[s[hilight[i]]]++;int flag=0;if(check())           right++;if(left<=right&&right<hilight.size())mp1[s[hilight[right]]]++;break;}if(!flag){//if(hilight[right]-lt<(hilight[left]+hilight[right])/2)//{if(len>=hilight[right]-hilight[left]+1){F=1;len=hilight[right]-hilight[left]+1;ansl=hilight[left];ansr=hilight[right];cout<<"len:"<<len<<endl;}  mp1[s[hilight[left]]]--;left++;}}if(F)return s.substr(ansl,ansr-ansl+1);else return "";}//mp1.clear();};

?

class Solution {
public:unordered_map<char,int> mp;unordered_map<char,int> mp1;// //題解說封裝
bool check()
{
for(const auto & p:mp)if(p.second>mp1[p.first])return false;
return true;
}string minWindow(string s, string t) {int ls=s.size();int lt=t.size();if(ls<lt)return "";if(s==t)return t;//vector<int> hilight;for(int i =0;i<lt;i++)mp[t[i]]++;// for(int i =0;i<ls;i++)if(mp[s[i]])hilight.push_back(i);// if(hilight.empty()) return "";int left=0;int right=0;mp1[s[0]]=1;int len=ls;int ansl,ansr;int F=0;while(left<=right&&right<ls){// for(int i=left;i<=right;i++)mp1[s[hilight[i]]]++;int flag=0;for(auto it=mp.begin();it!=mp.end();it++)if(it->second>mp1[it->first]){flag=1;right++;if(left<=right&&right<hilight.size())mp1[s[hilight[right]]]++;break;}if(!flag){//if(hilight[right]-lt<(hilight[left]+hilight[right])/2)//{if(len>=hilight[right]-hilight[left]+1){F=1;len=hilight[right]-hilight[left]+1;ansl=hilight[left];ansr=hilight[right];cout<<"len:"<<len<<endl;}  mp1[s[hilight[left]]]--;left++;}}if(F)return s.substr(ansl,ansr-ansl+1);else return "";}//mp1.clear();};

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

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

相關文章

大數據應用開發和項目實戰-Seaborn

一、Seaborn概述 Seaborn是基于Python數據可視化庫Matplotlib開發的擴展庫&#xff0c;專注于統計圖形的繪制&#xff0c;旨在通過簡潔的代碼實現復雜數據的可視化&#xff0c;幫助用戶更輕松地呈現和理解數據。其核心設計目標是簡化統計可視化流程&#xff0c;提供高級接口和美…

數據科學與計算

Seaborn的介紹 Seaborn 是一個建立在 Matplotlib 基礎之上的 Python 數據可視化庫&#xff0c;專注于繪制各種統計圖形&#xff0c;以便更輕松地呈現和理解數據。 Seaborn 的設計目標是簡化統計數據可視化的過程&#xff0c;提供高級接口和美觀的默認主題&#xff0c;使得用戶…

深入淺出循環神經網絡(RNN):原理、應用與實戰

1、引言 在深度學習領域&#xff0c;循環神經網絡&#xff08;Recurrent Neural Network, RNN&#xff09;是一種專門用于處理**序列數據**的神經網絡架構。與傳統的前饋神經網絡不同&#xff0c;RNN 具有**記憶能力**&#xff0c;能夠捕捉數據中的時間依賴性&#xff0c;廣泛應…

廣州創科——湖北房縣汪家河水庫除險加固信息化工程

汪家河水庫 汪家河水庫位于湖北省房縣&#xff0c;建于1971年&#xff0c;其地利可謂是天公之作&#xff0c;東西二山蜿蜒起伏&#xff0c;山峰相連&#xff0c;峰峰比高&#xff0c;無有盡頭&#xff0c;東邊陡峭&#xff0c;西邊相對平坦&#xff0c;半山腰有一條鄉村道路&am…

C++日更八股--day2

### C sort 的底層原理 這里其實原來問的是你如何優化快速排序&#xff0c;但是我最初只以為是隨機選擇基準&#xff0c;但是很顯然面試官對此并不滿意 閑暇之際&#xff0c;看到一篇介紹sort的原理的文章&#xff0c;才知道原來如是也 1.快速排序&#xff1a;作為主要算法&…

UniApp 的現狀與 WASM 支持的迫切性

UniApp 的現狀與 WASM 支持的迫切性 點擊進入免費1 UniApp 的現狀與 WASM 支持的迫切性 點擊進入免費版2 一、UniApp 的跨平臺優勢與性能瓶頸 UniApp 憑借“一次開發,多端發布”的核心理念,已成為跨平臺開發的主流框架之一。然而,隨著移動應用場景的復雜化(如 3D 渲染、音…

如何正確使用日程表

日程安排&#xff0c;是時間管理中非常重要的一項&#xff0c;也是不容易管好的一項。 日程安排&#xff0c;通常指放到日程表里的事情&#xff0c;一般來說&#xff0c;放到日程表的事情要符合以下幾個特點&#xff1a; 01.明確具體時間段&#xff0c;比如是下午2點到下午三…

【Token系列】14|Prompt不是文本,是token結構工程

文章目錄 14&#xff5c;Prompt不是文本&#xff0c;是token結構工程一、很多人寫的是“自然語言”&#xff0c;模型讀的是“token序列”二、Prompt寫法會直接影響token結構密度三、token分布影響Attention矩陣的聚焦方式四、token數 ≠ 有效信息量五、Prompt結構設計建議&…

研發效率破局之道閱讀總結(4)個人效率

研發效率破局之道閱讀總結(4)個人效率 Author: Once Day Date: 2025年4月30日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: 程序的藝術_Once-Day…

CNN代碼詳細注釋

import torch from torch import nn#定義張量x&#xff0c;它的尺寸是5x1x28x28 #表示了5個單通道28x28大小的數據 xtorch.zeros([5,1,28,28])#定義一個輸入通道是1&#xff0c;輸出通道是6&#xff0c;卷積核大小是5x5的卷積層 convnn.Conv2d(in_channels1,out_channels6,ker…

機器指標監控技術方案

文章目錄 機器指標監控技術方案架構圖組件簡介Prometheus 簡介核心特性適用場景 Grafana 簡介核心特性適用場景 Alertmanager 簡介核心特性適用場景 數據采集機器Node ExporterMySQL ExporterRedis ExporterES ExporterRocketMQ ExporterSpringcloud ExporterNacos 數據存儲短期…

【Office-Excel】單元格輸入數據后自動填充單位

1.自定義設置單元格格式 例如我想輸入數字10&#xff0c;回車確認后自動顯示10kg。 右擊單元格或者快捷鍵&#xff08;Ctrl1&#xff09;&#xff0c;選擇設置單元格格式&#xff0c;自定義格式輸入&#xff1a; 0"kg"格式仍是數字&#xff0c;但是顯示是10kg&…

JavaScript的3D庫有哪些?

JavaScript的3D庫有哪些&#xff1f; 在3D開發領域&#xff0c;JavaScript提供了多種庫和框架&#xff0c;使開發者能夠在瀏覽器中創建豐富的3D體驗。以下是一些流行的3D方面的JavaScript庫&#xff1a; Three.js&#xff1a;這是最著名的用于創建3D圖形的JavaScript庫之一。它…

中央網信辦部署開展“清朗·整治AI技術濫用”專項行動

為規范AI服務和應用&#xff0c;促進行業健康有序發展&#xff0c;保障公民合法權益&#xff0c;近日&#xff0c;中央網信辦印發通知&#xff0c;在全國范圍內部署開展為期3個月的“清朗整治AI技術濫用”專項行動。 中央網信辦有關負責人表示&#xff0c;本次專項行動分兩個階…

論文閱讀:2024 arxiv Jailbreaking Black Box Large Language Models in Twenty Queries

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Jailbreaking Black Box Large Language Models in Twenty Queries https://www.doubao.com/chat/4008882391220226 https://arxiv.org/pdf/2310.08419 速覽 這篇論文是來…

零基礎學指針2

零基礎學指針---大端和小端 零基礎學指針---什么是指針 零基礎學指針---取值運算符*和地址運算符& 零基礎學指針---結構體大小 零基礎學指針5---數據類型轉換 零基礎學指針6---指針數組和數組指針 零基礎學指針7---指針函數和函數指針 零基礎學指針8---函數指針數組…

《Python實戰進階》 No46:CPython的GIL與多線程優化

Python實戰進階 No46&#xff1a;CPython的GIL與多線程優化 摘要 全局解釋器鎖&#xff08;GIL&#xff09;是CPython的核心機制&#xff0c;它保證了線程安全卻限制了多核性能。本節通過concurrent.futures、C擴展優化和多進程架構&#xff0c;實戰演示如何突破GIL限制&#…

Golang實現函數默認參數

golang原生不支持默認參數 在日常開發中&#xff0c;我們有時候需要使用默認設置&#xff0c;但有時候需要提供自定義設置 結構體/類&#xff0c;在Java我們可以使用無參、有參構造函數來實現&#xff0c;在PHP中我們也可以實現(如 public function xxx($isCName false, $sec…

Chrome 136 H265 WebRTC 支持 正式版本已包含

時間過的真快&#xff0c;去年8月份寫過一篇文章介紹如何加參數方式啟動Chrome H265 硬件解碼器&#xff0c; 現在的136版本已經包含在內&#xff0c;至此WebRTC已經完整包含了H264和H265解碼器&#xff0c;這個事情應該從2015年開始&#xff0c;Google強推VP9 AV1&#xff0c…

12.SpringDoc OpenAPI 功能介紹(用于生成API接口文檔)

12.SpringDoc OpenAPI 功能介紹(用于生成API接口文檔) SpringDoc OpenAPI 是一個基于 OpenAPI 3.0/3.1 規范的工具&#xff0c;用于為 Spring Boot 應用生成 API 文檔。它是 springfox&#xff08;Swagger 2.x&#xff09;的現代替代方案&#xff0c;完全支持 Spring Boot 3.x…