日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ string 使用详解(含C++20新特性)

發布時間:2024/2/28 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ string 使用详解(含C++20新特性) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

元素訪問

迭代器

容量

操作

查找

std::erase,?std::erase_if?(std::basic_string)


std::basic_string?簡介

basic_string 是類模版,并且是容器類模版,basic_string 類模版的對象管理的序列是標準的 C++ 字符串,string 是模版形參為 char 的basci_string 模版類的類型定義basic_string?包括 wstring 、u16string 和 u32string?。basic_string 的聲明如下:?

template<?class?CharT,?class?Traits?=?std::char_traits<CharT>,?class?Allocator?=?std::allocator<CharT> >?class?basic_string;CharT - 字符類型 Traits - 指定字符類型上操作的特性類 Allocator - 用于分配內部存儲的分配器?(Allocator)?類型

?

?

元素訪問

?

at 返回到位于指定位置?pos?的字符的引用

constexpr?reference ? ? ? at(?size_type pos?); constexpr?const_reference at(?size_type pos?)?const;

進行邊界檢查,非法訪問時拋出?std::out_of_range?類型的異常。

#include <stdexcept> #include <iostream> #include <string>int main() {std::string s("message"); // 為容量s = "abc";s.at(2) = 'x'; // okstd::cout << s << '\n';std::cout << "string size = " << s.size() << '\n';std::cout << "string capacity = " << s.capacity() << '\n';try {// 拋出,即使容量允許訪問元素s.at(3) = 'x';}catch (std::out_of_range const& exc) {std::cout << exc.what() << '\n';} }abx string size = 3 string capacity = 7 basic_string::at

?

operator[] 返回到位于指定位置?pos?的字符的引用

constexpr?reference ? ? ? operator[](?size_type pos?); constexpr?const_reference operator[](?size_type pos?)?const;

不進行邊界檢查。若?pos?>?size()?,則行為未定義。

#include <iostream> #include <string>int main() {std::string const e("Exemplar");for (unsigned i = e.length() - 1; i != 0; i /= 2)std::cout << e[i];std::cout << '\n';const char* c = &e[0];std::cout << c << '\n'; // 作為 C 字符串打印// 更改 s 的最后字符為 'y'std::string s("Exemplar ");s[s.size()-1] = 'y';std::cout << s << '\n'; }rmx Exemplar Exemplary

?

front 返回到 string 中首字符的引用

constexpr?CharT&?front(); constexpr?const?CharT&?front()?const;

?empty()?==?true?則行為未定義。

#include <iostream> #include <string>int main() {{std::string s("Exemplary");char& f = s.front();f = 'e';std::cout << s << '\n'; // "exemplary"}{std::string const c("Exemplary");char const& f = c.front();std::cout << &f << '\n'; // "Exemplary"} }exemplary Exemplary

?

back 返回字符串中的末尾的字符

constexpr?CharT&?back(); constexpr?const?CharT&?back()?const;

若?empty()?==?true?則行為未定義。

#include <iostream> #include <string>int main() {{std::string s("Exemplary");char& back = s.back();back = 's';std::cout << s << '\n'; // "Exemplars"}{std::string const c("Exemplary");char const& back = c.back();std::cout << back << '\n'; // 'y'} }Exemplars y

?

data?返回指向作為字符存儲工作的底層數組的指針

constexpr?const?CharT*?data()?const?noexcept; constexpr?const?CharT*?data()?const?noexcept;

此指針滿足范圍?[data(), data() + size())?為合法,且其中的值對應存儲于字符串的值。

#include <algorithm> #include <cassert> #include <cstring> #include <string>int main() {std::string const s("Emplary");assert(s.size() == std::strlen(s.data()));assert(std::equal(s.begin(), s.end(), s.data()));assert(std::equal(s.data(), s.data() + s.size(), s.begin()));assert(0 == *(s.data() + s.size())); }

?

c_str?返回指向擁有數據等價于存儲于字符串中的空終止字符數組的指針

constexpr?const?CharT*?c_str()?const?noexcept;

該指針有范圍?[c_str(),??c_str() + size()]?為合法,且其中的值對應存儲于字符串的值,且在最后位置有個附加的空終止字符。

#include <iostream> #include <string> #include <stdio.h> using namespace std;int main() {const char *p1;const string s1 = "Asd123";p1 = s1.c_str();printf("[2]:%s\n", p1);return 0; }

?

注意:使用c_str()帶來的小問題

const char* c; ? std::string s = "1234"; ? c = s.c_str(); ? std::cout << c << std::endl; //輸出:1234 ? s = "abcd"; ? std::cout << c << std::endl; //輸出:abcd

?

解決的辦法

char* c = new char; ? std::string s = "1234"; ? //char *strcpy(char* dest, const char *src); strcpy(c, s.c_str()); ? std::cout << c << std::endl; //輸出:1234 ? s = "abcd"; ? std::cout << c << std::endl; //輸出:1234

?

operator?basic_string_view?返回表示整個字符串內容的字符串視圖

constexpr?operator?std::basic_string_view<CharT, Traits>()?const?noexcept; #include <iostream> #include <string> #include <string_view>void show_wstring_size(std::wstring_view wcstr_v) {std::cout << wcstr_v.size() << " code points\n"; }int main() {std::string cppstr = "窄字符串"; // 窄字符串std::wstring wcstr = L"寬字符串"; // 寬字符串// 從 string 隱式轉換到 string_view// 經由 std::string::operator string_view :std::string_view cppstr_v = cppstr;std::cout << cppstr_v << '\n'<< cppstr_v.size() << " code units\n";// 從 wstring 隱式轉換到 wstring_view// 經由 std::wstring::operator wstring_view :show_wstring_size(wcstr); }

?

?

迭代器

begin?& cbegin?返回指向字符串首字符的迭代器

constexpr?iterator begin()?noexcept; constexpr?const_iterator begin()?const?noexcept; constexpr?const_iterator cbegin()?const?noexcept;

begin()?返回可變的或常迭代器,取決于?*this?的常性。cbegin()?始終返回常迭代器。

#include <string> #include <iostream>int main() {std::string s("Exemplar");*s.begin() = 'e';std::cout << s <<'\n';auto i = s.cbegin();std::cout << *i << '\n'; // *i = 'E'; // 錯誤: i 是常迭代器 }exemplar e

?

end?& cend?返回指向后隨字符串末字符的字符的迭代器

constexpr?iterator end()?noexcept; constexpr?const_iterator end()?const?noexcept; constexpr?const_iterator cend()?const?noexcept;

此字符表現為占位符,試圖訪問它導致未定義行為。

#include <iostream> #include <algorithm> #include <iterator> #include <string>int main() {std::string s("Exemparl");std::next_permutation(s.begin(), s.end());std::string c;std::copy(s.cbegin(), s.cend(), std::back_inserter(c));std::cout << c <<'\n'; // "Exemplar" }Exemplar

?

rbegin?& ?crbegin?返回指向逆轉字符串首字符的逆向迭代器

constexpr?reverse_iterator rbegin()?noexcept; constexpr?const_reverse_iterator rbegin()?const?noexcept; constexpr?const_reverse_iterator crbegin()?const?noexcept;

它對應非逆向字符串的末字符。

#include <iostream> #include <algorithm> #include <iterator> #include <string>int main() {std::string s("Exemplar!");*s.rbegin() = 'y';std::cout << s << '\n'; // "Exemplary"std::string c;std::copy(s.crbegin(), s.crend(), std::back_inserter(c));std::cout << c << '\n'; // "yralpmexE" }Exemplary yralpmexE

?

rend?& crend?返回指向后隨逆向字符串末字符的字符的逆向迭代器

constexpr?reverse_iterator rend()?noexcept; constexpr?reverse_iterator rend()?noexcept; constexpr?const_reverse_iterator crend()?const?noexcept;

它對應前驅非逆向字符串首字符的字符。此字符表現為占位符,試圖訪問它會導致未定義行為。

#include <algorithm> #include <iostream> #include <iterator> #include <string>int main() {std::string s("A man, a plan, a canal: Panama");{std::string c;std::copy(s.rbegin(), s.rend(), std::back_inserter(c));std::cout << c <<'\n'; // "amanaP :lanac a ,nalp a ,nam A"}{std::string c;std::copy(s.crbegin(), s.crend(), std::back_inserter(c));std::cout << c <<'\n'; // "amanaP :lanac a ,nalp a ,nam A"} }amanaP :lanac a ,nalp a ,nam A amanaP :lanac a ,nalp a ,nam A

?

?

容量

?

empty?檢查 string 是否為空

[[nodiscard]]?constexpr?bool?empty()?const?noexcept; #include <iostream> #include <string>int main() {std::string s;std::boolalpha(std::cout);std::cout << "s.empty():" << s.empty() << "\t s:'" << s << "'\n";s = "Exemplar";std::cout << "s.empty():" << s.empty() << "\t s:'" << s << "'\n";s = "";std::cout << "s.empty():" << s.empty() << "\t s:'" << s << "'\n"; }s.empty():true s:'' s.empty():false s:'Exemplar' s.empty():true s:''

?

max_size?返回 string 由于保有系統或庫實現限制所能保有的最大元素數

constexpr?size_type max_size()?const?noexcept; #include <iostream> #include <string>int main() {std::string s;std::cout << "Maximum size of a string is " << s.max_size() << "\n"; }Maximum size of a string is 4294967294

?

reserve?使得 string 能準確地管理存儲分配

constexpr?void?reserve(?size_type new_cap?);

若?new_cap?大于當前?capacity(),則分配新存儲,并令?capacity()?大于或等于?new_cap?。?new_cap?小于或等于當前 capacity()?,則無效果。

#include <cassert> #include <string>int main() {std::string s;std::string::size_type new_capacity{ 100u };assert(new_capacity > s.capacity());s.reserve(new_capacity);assert(new_capacity <= s.capacity()); }

?

capacity?返回當前已為字符串分配空間的字符數

constexpr?size_type capacity()?const?noexcept; #include <iostream> #include <string>void show_capacity(std::string const& s) {std::cout << "'" << s << "' has capacity " << s.capacity() << ".\n"; }int main() {std::string s{"Exemplar"};show_capacity(s);s += " is an example string.";show_capacity(s); }'Exemplar' has capacity 15. 'Exemplar is an example string.' has capacity 31.

?

shrink_to_fit?請求移除未使用的容量

constexpr?void?shrink_to_fit();

這是減少?capacity()?到 size()?的非強制請求。是否滿足請求取依賴于實現。若(且唯若)發生重分配,則非法化所有指針、引用和迭代器。

include <iostream> #include <string>int main() {std::string s;std::cout << "Default-constructed capacity is " << s.capacity() << " and size is " << s.size() << '\n';for (int i=0; i<42; i++)s.append(" 42 ");std::cout << "Capacity after a couple of appends is " << s.capacity() << " and size is " << s.size() << '\n';s.clear();std::cout << "Capacity after clear() is " << s.capacity() << " and size is " << s.size() << '\n';s.shrink_to_fit();std::cout << "Capacity after shrink_to_fit() is " << s.capacity() << " and size is " << s.size() << '\n'; }Default-constructed capacity is 15 and size 0 Capacity after a couple of appends is 240 and size 168 Capacity after clear() is 240 and size 0 Capacity after shrink_to_fit() is 15 and size 0

?

?

操作

?

clear?如同通過執行?erase(begin(), end())?從 string 移除所有字符

constexpr?void?clear()?noexcept; #include <cassert> #include <string>int main() {std::string s{ "Exemplar" };std::string::size_type const capacity = s.capacity();s.clear();assert(s.capacity() == capacity);assert(s.empty());assert(s.size() == 0); }

?

insert?插入字符到 string 中

(1)constexpr?basic_string&?insert(?size_type index, size_type count, CharT ch?); (2)constexpr?basic_string&?insert(?size_type index,?const?CharT*?s?); (3)constexpr?basic_string&?insert(?size_type index, const?CharT*?s, size_type count?); (4)constexpr?basic_string&?insert(?size_type?index,?const?basic_string&?str?); (5)constexpr?basic_string&?insert(?size_type index,?const?basic_string&?str?); (6)constexpr?iterator insert(?const_iterator pos, CharT ch?); (7)constexpr?iterator insert(?const_iterator pos, size_type count, CharT ch?); (8)template<?class?InputIt?>constexpr?iterator insert(?const_iterator pos, InputIt first, InputIt last?); (9)constexpr?iterator insert(?const_iterator pos, std::initializer_list<CharT>?ilist?); (10)template?<?class?T?>constexpr?basic_string&?insert(?size_type pos,?const?T&?t?); (11)template?<?class?T?>constexpr?basic_string&?insert(?size_type index,?const?T&?t,size_type index_str, size_type count?=?npos);

(1)?在位置?index?插入?count?個字符?ch?的副本。

(2)?在位置?index?插入?s?所指向的空終止字符串。字符串的長度由首個空字符,用?Traits::length(s)?確定。

(3)?在位置?index?插入范圍?[s, s+count)?中的字符。范圍能含有空字符。

(4)?在位置?index?插入 string?str?。

(5)?在位置?index?插入由?str.substr(index_str, count)?獲得的 string 。

(6)?在?pos?所指向的字符前插入字符?ch?。

(7)?在?pos?所指向的元素(若存在)前插入?count?個字符?ch?的副本。

(8)?在?pos?所指向的元素(若存在)前插入來自范圍?[first, last)?的元素。

(9)?在?pos?所指向的元素(若存在)前插入來自 initializer_list?ilist?的字符。

(10)?如同用??std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后如同用?insert(pos, sv.data(), sv.size())?,在?pos?所指向的元素(若存在)前插入來自?sv?的元素。

(11)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后在?pos?所指向的元素(若存在)前插入來自?sv?的子視圖?[index_str, index_str+count)?的元素。若請求的子視圖越過?sv?的末尾,或若?count?==?npos?,則作為結果的子視圖是?[index_str, sv.size())?。若?index_str?>?sv.size()?或若?index?>?size()?,則拋出?std::out_of_range。

#include <cassert> #include <iterator> #include <string> using namespace std::string_literals; int main() {std::string s = "xmplr";// insert(size_type index, size_type count, char ch)s.insert(0, 1, 'E');assert("Exmplr" == s);// insert(size_type index, const char* s)s.insert(2, "e");assert("Exemplr" == s);// insert(size_type index, string const& str)s.insert(6, "a"s);assert("Exemplar" == s);// insert(size_type index, string const& str,// size_type index_str, size_type count)s.insert(8, " is an example string."s, 0, 14);assert("Exemplar is an example" == s);// insert(const_iterator pos, char ch)s.insert(s.cbegin() + s.find_first_of('n') + 1, ':');assert("Exemplar is an: example" == s);// insert(const_iterator pos, size_type count, char ch)s.insert(s.cbegin() + s.find_first_of(':') + 1, 2, '=');assert("Exemplar is an:== example" == s);// insert(const_iterator pos, InputIt first, InputIt last){std::string seq = " string";s.insert(s.begin() + s.find_last_of('e') + 1,std::begin(seq), std::end(seq));assert("Exemplar is an:== example string" == s);}// insert(const_iterator pos, std::initializer_list<char>)s.insert(s.cbegin() + s.find_first_of('g') + 1, { '.' });assert("Exemplar is an:== example string." == s); }

?

erase?從 string 移除指定的字符

constexpr?basic_string&?erase(?size_type index?=?0, size_type count?=?npos?); constexpr?iterator erase(?const_iterator position?); constexpr?iterator erase(?const_iterator first, const_iterator last?);

(1)?移除始于?index?的?min(count, size()?- index)?個字符。

(2)?移除位于?position?的字符。

(3)?移除范圍?[first, last)?中的字符。

#include <iostream> #include <algorithm> #include <string>int main() {std::string s = "This is an example";std::cout << s << '\n';s.erase(0, 5); // 擦除 "This "std::cout << s << '\n';s.erase(std::find(s.begin(), s.end(), ' ')); // 擦除 ' 'std::cout << s << '\n';s.erase(s.find(' ')); // 從 ' ' 到字符串尾裁剪std::cout << s << '\n'; }This is an example is an example isan example isan

?

push_back &?pop_back 后附加 / 移除給定字符?ch?到字符串尾

constexpr?void?push_back(?CharT ch?); constexpr?void?pop_back();

從字符串移除末字符。等價于?erase(end()?-?1,?1)?。若字符串為空則行為未定義。

#include <iostream> #include <string> using namespace std;int main() {string a = "asd";a.push_back('f');cout << a <<endl;a.pop_back();cout << a <<endl;return 0; }

?

append?后附加額外字符到字符串

(1)constexpr?basic_string&?append(?size_type count, CharT ch?); (2)constexpr?basic_string&?append(?const?basic_string&?str?); (3)constexpr?basic_string&?append(?const?basic_string&?str, size_type pos, size_type count?=?npos?); (4)constexpr?basic_string&?append(?const?CharT*?s, size_type count?); (5)constexpr?basic_string&?append(?const?CharT*?s?); (6)template<?class?InputIt?>constexpr?basic_string&?append(?InputIt first, InputIt last?); (7)constexpr?basic_string&?append(?std::initializer_list<CharT>?ilist?); (8)template?<?class?T?>constexpr?basic_string&?append(?const?T&?t?); (9)template?<?class?T?>constexpr?basic_string&?append(?const?T&?t, size_type pos, size_type count?=?npos?);

(1)?后附?count?個?ch?的副本

(2)?后附 string?str

(3)?后附?str?的子串?[pos, pos+count)?。若請求的子串越過 string 結尾,或若?count?==?npos?,則后附的子串為?[pos, size())?。若?pos?>?str.size()?,則拋出?std::out_of_range?。

(4)?后附范圍?[s, s + count)?中的字符。此范圍能含有空字符。

(5)?后附?s?所指向的空終止字符串。由首個空字符用?Traits::length(s)?確定字符串的長度。

(6)?后附范圍?[first, last)?中的字符。

(7)?后附來自 initializer_list?ilist?的字符。

(8)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后如同用?append(sv.data(), sv.size())?后附所有來自?sv?的字符。

(9)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后后附來自?sv?子視圖?[pos, pos+count)?的字符。若請求的子視圖越過?sv?的結尾,或若?count?==?npos?,則后附的子視圖為?[pos, sv.size())?。

#include <string> #include <iostream>int main() {std::basic_string<char> str = "string";const char* cptr = "C-string";const char carr[] = "Two and one";std::string output;// 1) 后附 char 3 次。// 注意,這是僅有的接受 char 的重載。output.append(3, '*');std::cout << "1) " << output << "\n";// 2) 后附整個 stringoutput.append(str);std::cout << "2) " << output << "\n";// 3) 后附字符串的一部分(此情況為最后 3 個字母)case)output.append(str, 3, 3);std::cout << "3) " << output << "\n";// 4) 后附 C 字符串的一部分// 注意,因為 `append` 返回 *this ,我們能一同鏈式調用output.append(1, ' ').append(carr, 4);std::cout << "4) " << output << "\n";// 5) 后附整個 C 字符串output.append(cptr);std::cout << "5) " << output << "\n";// 6) 后附范圍output.append(std::begin(carr) + 3, std::end(carr));std::cout << "6) " << output << "\n";// 7) 后附 initializer_listoutput.append({ ' ', 'l', 'i', 's', 't' });std::cout << "7) " << output << "\n"; }1) *** 2) ***string 3) ***stringing 4) ***stringing Two 5) ***stringing Two C-string 6) ***stringing Two C-string and one 7) ***stringing Two C-string and one list

?

operator+=?后附加額外字符到字符串

(1)constexpr?basic_string&?operator+=(?const?basic_string&?str?); (2)constexpr?basic_string&?operator+=(?CharT ch?); (3)constexpr?basic_string&?operator+=(?const?CharT*?s?); (4)constexpr?basic_string&?operator+=(?std::initializer_list<CharT>?ilist?); (5)template?<?class?T?>constexpr?basic_string&?operator+=(?const?T&?t?);

(1)?后附 string?str?。

(2)?后附字符?ch?。

(3)?后附?s?所指向的空終止字符串。

(4)?后附 initializer_list?ilist?中的字符。

(5)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后后附字符串視圖?sv?中的字符,如同用?append(sv)?。

#include <iostream> #include <iomanip> #include <string>int main() {std::string str;str.reserve(50); // 預留足夠的存儲空間以避免內存分配std::cout << std::quoted(str) << '\n'; // 空字符串str += "This";std::cout << std::quoted(str) << '\n';str += std::string(" is ");std::cout << std::quoted(str) << '\n';str += 'a';std::cout << std::quoted(str) << '\n';str += {' ','s','t','r','i','n','g','.'};std::cout << std::quoted(str) << '\n';str += 76.85; // 等價于 str += static_cast<char>(76.85) ,可能不合意圖std::cout << std::quoted(str) << '\n'; }"" "This" "This is " "This is a" "This is a string." "This is a string.L"

?

compare?比較兩個字符序列

(1)constexpr?int?compare(?const?basic_string&?str?)?const?noexcept; (2)constexpr?int?compare(?size_type pos1, size_type count1, const?basic_string&?str?)?const; (3)constexpr?int?compare(?size_type pos1, size_type count1,const?basic_string&?str,size_type pos2, size_type count2?=?npos?)?const; (4)constexpr?int?compare(?const?CharT*?s?)?const; (5)constexpr?int?compare(?size_type pos1, size_type count1, const?CharT*?s?)?const; (6)constexpr?int?compare(?size_type pos1, size_type count1, const?CharT*?s, size_type count2?)?const; (7)template?<?class?T?>constexpr?int?compare(?const?T&?t?)?const?noexcept(/* see below */); (8)template?<?class?T?>constexpr?int?compare(?size_type pos1, size_type count1, const?T&?t?)?const; (9)template?<?class?T?>constexpr?int?compare(?size_type pos1, size_type count1,const?T&?t, size_type pos2, size_type count2?=?npos)?const;

(1)?比較此 string 與?str?。

(2)?比較此 string 的?[pos1, pos1+count1)?子串與?str?。若?count1?>?size()?-?pos1?則子串為?[pos1, size())?。

(3)?比較此 string 的?[pos1, pos1+count1)?子串與?str?的子串?[pos2, pos2+count2)?。若?count1?>?size()?-?pos1則第一子串為?[pos1, size())?。類似地若?count2?>?str.size()?-?pos2?則第二子串為?[pos2, str.size())?。

(4)?比較此 string 與始于?s?所指向字符的長度為?Traits::length(s)?的空終止字符序列。

(5)?比較此 string 的?[pos1, pos1+count1)?子串與始于?s?所指向字符的長度為?Traits::length(s)?的空終止字符序列。若?count1?>?size()?-?pos1?則子串為?[pos1, size())?。

(6)?比較此 string 的?[pos1, pos1+count1)?子串與范圍?[s, s + count2)?中的字符。(注意:范圍?[s, s + count2)?中的字符可包含空字符。)

(7)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后比較此 string 與?sv?。

(8)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后比較此 string 的?[pos1, pos1+count1)?子串與?sv?,如同用?std::basic_string_view<CharT, Traits>(data(), size()).substr(pos1, count1).compare(sv)?。

(9)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后比較此 string 的?[pos1, pos1+count1)?子串與?sv?的?[pos2, pos2+count2)?子串,如同用?std::basic_string_view<CharT, Traits>(data(), size()).substr(pos1, count1).compare(sv.substr(pos2, count2));。

按下列方式比較始于?data1?的?count1?個字符組成的字符序列與始于?data2?的?count2?個字符組成的字符序列。首先,如同用?size_type rlen?=?std::min(count1, count2)?計算要比較的字符數。然后調用?Traits::compare(data1, data2, rlen)?比較序列。對于標準字符特性,此函數進行逐字符字典序比較。若結果為零(到此為止的字符序列相等),則按下列方式比較其大小:

#include <cassert> #include <string> #include <iostream>int main() {// 1) 與另一 string 比較{int compare_value{std::string{"Batman"}.compare(std::string{"Superman"})};std::cout << (compare_value < 0 ? "Batman comes before Superman\n" :compare_value > 0 ? "Superman comes before Batman\n" :"Superman and Batman are the same.\n");}// 2) 與另一 string 比較子串{int compare_value{std::string{"Batman"}.compare(3, 3, std::string{"Superman"})};std::cout << (compare_value < 0 ? "man comes before Superman\n" :compare_value > 0 ? "Superman comes before man\n" :"man and Superman are the same.\n");}// 3) 與另一子串比較子串{std::string a{"Batman"};std::string b{"Superman"};int compare_value{a.compare(3, 3, b, 5, 3)};std::cout << (compare_value < 0 ? "man comes before man\n" :compare_value > 0 ? "man comes before man\n" :"man and man are the same.\n");// 與另一子串比較子串// 默認到為另一 string 的末尾assert(compare_value == a.compare(3, 3, b, 5));}// 4) 與另一 char 指針比較{int compare_value{std::string{"Batman"}.compare("Superman")};std::cout << (compare_value < 0 ? "Batman comes before Superman\n" :compare_value > 0 ? "Superman comes before Batman\n" :"Superman and Batman are the same.\n");}// 5) 與另一 char 指針比較子串{int compare_value{std::string{"Batman"}.compare(3, 3, "Superman")};std::cout << (compare_value < 0 ? "man comes before Superman\n" :compare_value > 0 ? "Superman comes before man\n" :"man and Superman are the same.\n");}// 6) 與另一 char 指針子串比較子串{int compare_value{std::string{"Batman"}.compare(0, 3, "Superman", 5)};std::cout << (compare_value < 0 ? "Bat comes before Super\n" :compare_value > 0 ? "Super comes before Bat\n" :"Super and Bat are the same.\n");} }Batman comes before Superman Superman comes before man man and man are the same. Batman comes before Superman Superman comes before man Bat comes before Super

?

starts_with?檢查 string 是否始于某一前綴

(1)constexpr?bool?starts_with(?std::basic_string_view<CharT,Traits>?sv?) const?noexcept; (2)constexpr?bool?starts_with(?CharT c?)?const?noexcept; (3)constexpr?bool?starts_with(?const?CharT*?s?)?const;

(1)?string_view?sv?(可以是從另一?std::basic_string?隱式轉換的結果)。

(2)?單個字符?c

(3)?空終止字符串?s

所有三個重載等效地返回?std::basic_string_view<CharT, Traits>(data(), size()).starts_with(x)?,其中?x?是參數。

#include <iostream> #include <string_view> #include <string>template <typename PrefixType> void test_prefix_print(const std::string& str, PrefixType prefix) {std::cout << '\'' << str << "' starts with '" << prefix << "': " <<str.starts_with(prefix) << '\n'; }int main() {std::boolalpha(std::cout); auto helloWorld = std::string("hello world");test_prefix_print(helloWorld, std::string_view("hello"));test_prefix_print(helloWorld, std::string_view("goodbye"));test_prefix_print(helloWorld, 'h');test_prefix_print(helloWorld, 'x'); }'hello world' starts with 'hello': true 'hello world' starts with 'goodby': false 'hello world' starts with 'h': true 'hello world' starts with 'x': false

?

ends_with?檢查 string 是否終于某一后綴

(1)constexpr?bool?ends_with(?std::basic_string_view<CharT,Traits>?sv?) const?noexcept; (2)constexpr?bool?ends_with(?CharT c?)?const?noexcept; (3)constexpr?bool?ends_with(?const?CharT*?s?)?const;

(1)?string_view?sv?(可以是從另一?std::basic_string?隱式轉換的結果)。

(2)?單個字符?c

(3)?空終止字符串?s

所有三個重載等效地返回?std::basic_string_view<CharT, Traits>(data(), size()).ends_with(x)?,其中?x?是參數。

#include <iostream> #include <string_view> #include <string>template <typename SuffixType> void test_suffix_print(const std::string& str, SuffixType suffix) {std::cout << '\'' << str << "' ends with '" << suffix << "': " <<str.ends_with(suffix) << '\n'; }int main() {std::boolalpha(std::cout); auto helloWorld = std::string("hello world");test_suffix_print(helloWorld, std::string_view("world"));test_suffix_print(helloWorld, std::string_view("goodby"));test_suffix_print(helloWorld, 'd');test_suffix_print(helloWorld, 'x'); }'hello world' ends with 'world': true 'hello world' ends with 'goodby': false 'hello world' ends with 'd': true 'hello world' ends with 'x': false

?

replace?以新字符串替換?[pos, pos + count)?或?[first, last)?所指示的 string 部分

(1)constexpr?basic_string&?replace(?size_type pos, size_type count, const?basic_string&?str?);constexpr?basic_string&?replace(?const_iterator first, const_iterator last, const?basic_string&?str?); (2)constexpr?basic_string&?replace(?size_type pos, size_type count,const?basic_string&?str,size_type pos2, size_type count2?=?npos?); (3)template<?class?InputIt?>constexpr?basic_string&?replace(?const_iterator first, const_iterator last,InputIt first2, InputIt last2?); (4)constexpr?basic_string&?replace(?size_type pos, size_type count, const?CharT*?cstr, size_type count2?);constexpr?basic_string&?replace(?const_iterator first, const_iterator last, const?CharT*?cstr, size_type count2?); (5)constexpr?basic_string&?replace(?size_type pos, size_type count, const?CharT*?cstr?);constexpr?basic_string&?replace(?const_iterator first, const_iterator last, const?CharT*?cstr?); (6)constexpr?basic_string&?replace(?size_type pos, size_type count, size_type count2, CharT ch?);constexpr?basic_string&?replace(?const_iterator first, const_iterator last, size_type count2, CharT ch?); (7)constexpr?basic_string&?replace(?const_iterator first, const_iterator last,? std::initializer_list<CharT>?ilist?); (8)template?<?class?T?>constexpr?basic_string&?replace(?size_type pos, size_type count, const?T&?t?);template?<?class?T?>constexpr?basic_string&?replace(?const_iterator first, const_iterator last, const?T&?t?); (9)template?<?class?T?>constexpr?basic_string&?replace(?size_type pos, size_type count,?const?T&?t,size_type pos2, size_type count2?=?npos?);

(1)?string?str?;

(2)?str?的子串?[pos2, pos2 + count2)?,除了若?count2==npos?或若它可能越過?str.size()?,則使用?[pos2, str.size())?。

(3)?范圍?[first2, last2)?中的字符。

(4)?范圍?[cstr, cstr + count2)?中的字符;

(5)?范圍?[cstr, cstr + Traits::length(cstr))?中的字符;

(6)?字符?ch?的?count2?個副本;

(7)?initializer_list?ilist?中的字符;

(8)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?從?t?轉換而來的 string_view?sv?的字符。

(9)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?從?t?轉換而得的字符串視圖?sv?的子視圖?[pos2, pos2 + count2)?,除了若?count2==npos?或它將越過?sv.size()?,則使用?[pos2, sv.size())?。

#include <iostream> #include <string>int main() {std::string str("The quick brown fox jumps over the lazy dog.");str.replace(10, 5, "red"); // (5)str.replace(str.begin(), str.begin() + 3, 1, 'A'); // (6)std::cout << str << '\n'; }A quick red fox jumps over the lazy dog.

?

substr?返回子串?[pos, pos+count)

constexpr?basic_string substr(?size_type pos?=?0, size_type count?=?npos?)?const;

?若請求的子串越過 string 的結尾,或若?count?==?npos?,則返回的子串為?[pos, size())?。

#include <string> #include <iostream>int main() {std::string a = "0123456789abcdefghij";// count 為 npos ,返回 [pos, size())std::string sub1 = a.substr(10);std::cout << sub1 << '\n';// pos 和 pos+count 都在邊界內,返回 [pos, pos+count)std::string sub2 = a.substr(5, 3);std::cout << sub2 << '\n';// pos 在邊界內, pos+count 不在,返回 [pos, size()) std::string sub4 = a.substr(a.size()-3, 50);std::cout << sub4 << '\n';try {// pos 在邊界外,拋出std::string sub5 = a.substr(a.size()+3, 50);std::cout << sub5 << '\n';} catch(const std::out_of_range& e) {std::cout << "pos exceeds string size\n";} }abcdefghij 567 hij pos exceeds string size

?

copy?復制子串?[pos, pos+count)?到?dest?所指向的字符串

constexpr?size_type copy(?CharT*?dest, size_type count, size_type pos?=?0?)?const;

若請求的子串越過 string 結尾,或若?count?==?npos?,則復制的子串為?[pos, size())?。產生的字符串不是空終止的。若?pos?>?size()?,則拋出 std::out_of_range?。

#include <string> #include <iostream>int main() {std::string foo("quuuux");char bar[7]{};foo.copy(bar, sizeof bar);std::cout << bar << '\n'; } quuuux

?

resize?重設 string 大小以含?count?個字符

constexpr?void?resize(?size_type count?); constexpr?void?resize(?size_type count, CharT ch?);

若當前大小小于?count?,則后附額外的字符。若當前大小大于?count?,則縮減 string 到為其首?count?個元素。第一版本初始化新字符為?CharT()?,第二版本初始化新字符為?ch?。

#include <iostream> #include <stdexcept>int main() {std::cout << "Basic functionality:\n";const unsigned desired_length(8);std::string long_string( "Where is the end?" );std::string short_string( "Ha" );// 縮短std::cout << "Before: \"" << long_string << "\"\n";long_string.resize( desired_length );std::cout << "After: \"" << long_string << "\"\n";// 加長std::cout << "Before: \"" << short_string << "\"\n";short_string.resize( desired_length, 'a' );std::cout << "After: \"" << short_string << "\"\n";std::cout << "\nErrors:\n";{std::string s; try {// 大小 OK ,無 length_error// (可能拋 bad_alloc )s.resize(s.max_size() - 1, 'x');} catch (const std::bad_alloc&) {std::cout << "1. bad alloc\n";}try {// 大小 OK ,無 length_error// (可能拋 bad_alloc )s.resize(s.max_size(), 'x');} catch (const std::bad_alloc& exc) {std::cout << "2. bad alloc\n";}try {// 大小錯誤,拋出 length_errors.resize(s.max_size() + 1, 'x');} catch (const std::length_error&) {std::cout << "3. length error\n";}} }Basic functionality: Before: "Where is the end?" After: "Where is" Before: "Ha" After: "Haaaaaaa"Errors: 1. bad alloc 2. bad alloc 3. length error

?

swap?交換 string 與?other?的內容

constexpr?void?swap(?basic_string&?other?)?noexcept(/* see below */); #include <string> #include <iostream>int main() {std::string a = "AAA";std::string b = "BBB";std::cout << "before swap" << '\n';std::cout << "a: " << a << '\n';std::cout << "b: " << b << '\n';a.swap(b);std::cout << "after swap" << '\n';std::cout << "a: " << a << '\n';std::cout << "b: " << b << '\n'; }before swap a: AAA b: BBB after swap a: BBB b: AAA

?

?

查找

?

find?尋找首個等于給定字符序列的子串

(1)constexpr?size_type find(?const?basic_string&?str, size_type pos?=?0?)?const?noexcept; (2)constexpr?size_type find(?const?CharT*?s, size_type pos, size_type count?)?const; (3)constexpr?size_type find(?const?CharT*?s, size_type pos?=?0?)?const; (4)constexpr?size_type find(?CharT ch, size_type pos?=?0?)?const?noexcept; (5)template?<?class?T?>constexpr?size_type find(?const?T&?t, size_type pos?=?0?)?const?noexcept(/* see below */);

搜索始于?pos?,即找到的子串必須不始于?pos?之前的位置。

(1)?尋找等于?str?的首個子串。

(2)?尋找等于范圍?[s, s+count)?的首個子串。此范圍能含空字符。

(3)?尋找等于?s?所指向的字符串的首個子串。由首個空字符,用?Traits::length(s)?確定字符串長度。

(4)?尋找首個字符?ch?(由后述規則當作單字節子串)。

(5)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后尋找等于字符串視圖?sv?的首個子串。

#include <string> #include <iostream>void print(std::string::size_type n, std::string const &s) {if (n == std::string::npos) {std::cout << "not found\n";} else {std::cout << "found: " << s.substr(n) << '\n';} }int main() {std::string::size_type n;std::string const s = "This is a string";// 從 string 開始搜索n = s.find("is");print(n, s);// 從位置 5 開始搜索n = s.find("is", 5);print(n, s);// 尋找單個字符n = s.find('a');print(n, s);// 尋找單個字符n = s.find('q');print(n, s); }found: is is a string found: is a string found: a string not found

?

rfind?尋找等于給定字符序列的最后子串

(1)constexpr?size_type rfind(?const?basic_string&?str, size_type pos?=?npos?)?const?noexcept; (2)constexpr?size_type rfind(?const?CharT*?s, size_type pos, size_type count?)?const; (3)constexpr?size_type rfind(?const?CharT*?s, size_type pos?=?npos?)?const; (4)constexpr?size_type rfind(?CharT ch, size_type pos?=?npos?)?const?noexcept; (5)template?<?class?T?> constexpr?size_typerfind(?const?T&?t, size_type pos?=?npos?)?const?noexcept(/* see below */);

搜索始于?pos?,即找到的子串必須不始于?pos?后的位置。若將?npos?或任何不小于?size()-1 的值作為?pos?傳遞,則在整個字符串中搜索。

(1)?尋找等于?str?的最后子串。

(2)?尋找等于范圍?[s, s+count)?的最后子串。此范圍能包含空字符。

(3)?尋找等于?s?所指向的字符串的最后子串。由首個空字符,用?Traits::length(s)?確定字符串長度。

(4)?尋找等于?ch?的最后字符。

(5)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后尋找等于?sv?內容的最后子串。

#include <string> #include <iostream>void print(std::string::size_type n, std::string const &s) {if (n == std::string::npos) {std::cout << "not found\n";} else {std::cout << "found: \"" << s.substr(n) << "\" at " << n << '\n';} }int main() {std::string::size_type n;std::string const s = "This is a string";// 從字符串尾反向搜索n = s.rfind("is");print(n, s);// 從位置 4 反向搜索n = s.rfind("is", 4);print(n, s);// 尋找單個字符n = s.rfind('s');print(n, s);// 尋找單個字符n = s.rfind('q');print(n, s); }found: "is a string" at 5 found: "is is a string" at 2 found: "string" at 10 not found

?

find_first_of?尋找等于給定字符序列中字符之一的首個字符

(1)constexpr?size_type find_first_of(?const?basic_string&?str, size_type pos?=?0?)?const?noexcept; (2)constexpr?size_type find_first_of(?const?CharT*?s, size_type pos, size_type count?)?const; (3)constexpr?size_type find_first_of(?const?CharT*?s, size_type pos?=?0?)?const; (4)constexpr?size_type find_first_of(?CharT ch, size_type pos?=?0?)?const?noexcept; (5)template?<?class?T?> constexpr?size_type find_first_of(?const?T&?t,size_type pos?=?0?)?const?noexcept(/* see below */);

搜索只考慮區間 [pos, size()) 。若區間中不存在字符,則返回 npos

(1)?尋找等于?str?中字符之一的首個字符。

(2)?尋找等于范圍?[s, s+count)?中字符中字符之一的首個字符。此范圍能包含空字符。

(3)?尋找等于?s?所指向的字符串中字符之一的首個字符。由首個空字符,用?Traits::length(s)?確定字符串長度。

(4)?尋找等于?ch?的首個字符。

(5)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后尋找等于?sv?中字符之一的首個字符。

#include <iostream> #include <string>int main() {// 測試字符串std::string str = std::string("Hello World!");// 搜索用的字符串和字符std::string search_str = std::string("o");const char* search_cstr = "Good Bye!";std::cout << str.find_first_of(search_str) << '\n';std::cout << str.find_first_of(search_str, 5) << '\n';std::cout << str.find_first_of(search_cstr) << '\n';std::cout << str.find_first_of(search_cstr, 0, 4) << '\n';// 'x' 不在 "Hello World' 中,從而它將返回 std::string::nposstd::cout << str.find_first_of('x') << '\n'; }4 7 1 4 18446744073709551615

?

find_first_not_of?尋找不等于給定字符序列中任何字符的首個字符

(1)constexpr?size_type find_first_not_of(?const?basic_string&?str, size_type pos?=?0?)?const?noexcept; (2)constexpr?size_type find_first_not_of(?const?CharT*?s, size_type pos, size_type count?)?const; (3)constexpr?size_type find_first_not_of(?const?CharT*?s, size_type pos?=?0?)?const; (4)constexpr?size_type find_first_not_of(?CharT ch, size_type pos?=?0?)?const?noexcept; (5)template?<?class?T?> constexpr?size_type find_first_not_of(?const?T&?t,size_type pos?=?0?)?const?noexcept(/* see below */);

搜索只考慮區間 [pos,?size()) 。若區間中不存在字符,則將返回?npos?。

(1)?尋找不等于?str?中任何字符的首個字符。

(2)?尋找不等于范圍?[s, s+count)?中任何字符的首個字符。此范圍能包含空字符。

(3)?尋找不等于?s所指向的字符串中任何字符的首個字符。用?Traits::length(s)?,由首個空終止符確定字符串長度。

(4)?尋找不等于?ch?的首個字符。

(5)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后尋找不等于?sv中任何字符的首個字符。

#include <string> #include <iostream>int main() {std::string to_search = "Some data with %MACROS to substitute";std::cout << "Before: " << to_search << '\n';auto pos = std::string::npos;while ((pos = to_search.find('%')) != std::string::npos) {// 宏名中容許大寫字母、小寫字母和數字const auto after = to_search.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", pos + 1);// 現在 to_search[pos] == '%' 而 to_search[after] == ' ' (在 'S' 后)if(after != std::string::npos)to_search.replace(pos, after - pos, "some very nice macros");}std::cout << "After: " << to_search << '\n'; }Before: Some data with %MACROS to substitute After: Some data with some very nice macros to substitute

?

find_last_of?尋找等于給定字符序列中字符之一的最后字符

(1)constexpr?size_type find_last_of(?const?basic_string&?str, size_type pos?=?npos?)?const?noexcept; (2)constexpr?size_type find_last_of(?const?CharT*?s, size_type pos, size_type count?)?const; (3)constexpr?size_type find_last_of(?const?CharT*?s, size_type pos?=?npos?)?const; (4)constexpr?size_type find_last_of(?CharT ch, size_type pos?=?npos?)?const?noexcept; (5)template?<?class?T?> constexpr?size_type find_last_of(?const?T&?t,size_type pos?=?npos?)?const?noexcept(/* see below */);

不指定準確的搜索算法。搜索只考慮區間?[0, pos]?。若區間中不存在這種字符,則返回 npos?。

(1)?尋找等于?str?中字符之一的最后字符。

(2)?尋找等于范圍?[s, s+count)?中字符之一的最后字符。此范圍能包含空字符。

(3)?尋找等于?s?所指向的字符串中字符之一的最后字符。用?Traits::length(s)?,由首個空字符確定字符串長度。

(4)?尋找等于?ch?的最后字符。

(5)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后尋找等于?sv?中字符之一的最后字符。

#include<string> #include<iostream> int main() {const std::string path="/root/config";auto const pos=path.find_last_of('/');const auto leaf=path.substr(pos+1);std::cout << leaf << '\n'; }config

?

find_last_not_of?尋找不等于給定字符序列中任何字符的最后字符

(1)constexpr?size_type find_last_not_of(?const?basic_string&?str, size_type pos?=?npos?)?const?noexcept; (2)constexpr?size_type find_last_not_of(?const?CharT*?s, size_type pos, size_type count?)?const; (3)constexpr?size_type find_last_not_of(?const?CharT*?s, size_type pos?=?npos?)?const; (4)constexpr?size_type find_last_not_of(?CharT ch, size_type pos?=?npos?)?const?noexcept; (5)template?<?class?T?> constexpr?size_type find_last_not_of(?const?T&?t,size_type pos?=?npos?)?const?noexcept(/* see below */);

搜索只考慮區間?[0, pos]?。若區間中不存在這種字符,則返回?npos?。

(1)?尋找不等于?str?中任何字符的最后字符。

(2)?尋找不等于范圍?[s, s+count)?中任何字符的最后字符。此范圍能包含空字符。

(3)?尋找不等于?s?所指向的字符串中任何字符的最后字符。用?Traits::length(s)?確定字符串長度。

(4)?尋找不等于?ch?的最后字符。

(5)?如同用?std::basic_string_view<CharT, Traits>?sv?=?t;?隱式轉換?t?為 string_view?sv?,然后尋找不等于?sv中任何字符的最后字符。

#include <iostream> #include <string>void show_pos(const std::string& str, std::string::size_type found) {if (found != std::string::npos) {std::cout << "[" << found << "] = \'" << str[found] << "\'\n";} else {std::cout << "not found" "\n";} }int main() {std::string str { "abc_123" };char const* skip_set { "0123456789" };std::string::size_type str_last_pos { std::string::npos };show_pos(str, str.find_last_not_of(skip_set)); // [3] = '_'str_last_pos = 2;show_pos(str, str.find_last_not_of(skip_set, str_last_pos)); // [2] = 'c'str_last_pos = 2;show_pos(str, str.find_last_not_of('c', str_last_pos)); // [1] = 'b'const char arr[] { '3', '4', '5' };show_pos(str, str.find_last_not_of(arr)); // [5] = '2'str_last_pos = 2;std::string::size_type skip_set_size{4};show_pos(str, str.find_last_not_of(skip_set,str_last_pos,skip_set_size)); // [2] = 'c'show_pos(str, str.find_last_not_of("abc")); // [6] = '3'str_last_pos = 2;show_pos(str, str.find_last_not_of("abc", str_last_pos)); // 找不到 }[3] = '_' [2] = 'c' [1] = 'b' [5] = '2' [2] = 'c' [6] = '3' not found

?

?

std::erase,?std::erase_if?(std::basic_string)

(1)template<?...,?class?U?>constexpr?typename?std::basic_string<...>::size_typeerase(std::basic_string<...>&?c,?const?U&?value);(2)template<?...,?class?Pred?>constexpr?typename?std::basic_string<...>::size_typeerase_if(std::basic_string<...>&?c, Pred pred);

(1)?從容器中擦除所有比較等于?value?的元素。等價于

auto it = std::remove(c.begin(), c.end(), value); auto r = std::distance(it, c.end()); c.erase(it, c.end()); return r;

(2)?從容器中擦除所有滿足?pred?的元素。等價于

auto it = std::remove_if(c.begin(), c.end(), pred); auto r = std::distance(it, c.end()); c.erase(it, c.end()); return r; #include <iostream> #include <numeric> #include <string>void print_container(const std::string& c) {for (auto x : c) {std::cout << x << ' ';}std::cout << '\n'; }int main() {std::string cnt(10, ' ');std::iota(cnt.begin(), cnt.end(), '0');std::cout << "Init:\n";print_container(cnt);auto erased = std::erase(cnt, '3');std::cout << "Erase \'3\':\n";print_container(cnt);std::erase_if(cnt, [](char x) { return (x - '0') % 2 == 0; });std::cout << "Erase all even numbers:\n";print_container(cnt);std::cout << "In all " << erased << " even numbers were erased.\n"; }Init: 0 1 2 3 4 5 6 7 8 9 Erase '3': 0 1 2 4 5 6 7 8 9 Erase all even numbers: 1 3 7 9 In all 5 even numbers were erased.

?

總結

以上是生活随笔為你收集整理的C++ string 使用详解(含C++20新特性)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩av手机在线看 | 高清视频一区 | 亚洲欧洲视频 | 麻豆视频在线播放 | 天天干,天天射,天天操,天天摸 | 久久99爱视频 | 日韩毛片在线播放 | 亚洲精欧美一区二区精品 | 久久国内精品 | 国产亚洲精品久久久久久电影 | 黄色av三级在线 | 在线看av网址 | 私人av| 青青草国产精品 | 日韩一区二区三区免费电影 | 91毛片在线 | 日本精品久久久久中文字幕5 | 天天做天天爱天天爽综合网 | 欧美福利片在线观看 | 国产精品视频内 | 91精品视频导航 | 天天夜夜狠狠操 | 日韩网站视频 | 美女久久久久久久久久 | 激情伊人五月天 | 免费在线观看亚洲视频 | 日韩高清在线观看 | 国产精品 日本 | 中文字幕一区二区三区在线视频 | 亚洲综合一区二区精品导航 | 日韩免费网址 | 国产永久免费 | 操综合| 欧美成人影音 | av不卡免费在线观看 | 高清不卡一区二区三区 | 久久在线观看视频 | 91黄视频在线观看 | 色先锋资源网 | 久久久资源 | 久久久高清视频 | 国产综合片 | 热久久电影 | 亚洲综合激情五月 | 玖玖在线观看视频 | 日日夜夜婷婷 | 欧美a级在线 | 精品国产一区二区三区不卡 | 日韩性xxx| 狠狠色丁香久久婷婷综合丁香 | 五月婷在线观看 | 91九色精品国产 | 亚洲精品一区二区三区新线路 | 人人爽人人爱 | 久久精品资源 | 免费av网站在线 | 久久久久久久久久久久久久免费看 | 欧美激情综合网 | 91看片黄色| 天天射天天射天天射 | 99在线观看免费视频精品观看 | 狠狠操天天射 | 国产成人精品区 | 国产色婷婷在线 | 国产最新91 | 人人涩 | 五月婷网 | 91中文在线视频 | 97视频网址| 美女黄视频免费看 | 亚洲精品乱码久久久久久蜜桃欧美 | 涩涩网站在线观看 | 国产午夜精品一区二区三区欧美 | 公与妇乱理三级xxx 在线观看视频在线观看 | 久久在线免费视频 | 国产乱码精品一区二区三区介绍 | 精品国精品自拍自在线 | 亚洲日韩欧美视频 | 91成人在线观看喷潮 | 成人av资源网 | 日韩av片免费在线观看 | 国产91精品一区二区麻豆网站 | 国产午夜在线观看视频 | 日韩免费在线一区 | 久久成年人网站 | 日日干天天插 | 欧美看片| 最近日韩中文字幕中文 | 欧美日韩另类在线观看 | 国产自在线 | 91自拍视频在线观看 | 日日干激情五月 | 国产一二三精品 | 一区二区不卡视频在线观看 | 亚洲精品国产精品乱码在线观看 | 96精品高清视频在线观看软件特色 | 日韩亚洲精品电影 | 91丨九色丨蝌蚪丨对白 | 一级精品视频在线观看宜春院 | 久久久久亚洲国产精品 | 国产精品久久久久久69 | 亚洲九九九在线观看 | 91久久奴性调教 | 日韩中文字幕免费 | 色.www| 国产日产精品一区二区三区四区的观看方式 | 国产中年夫妇高潮精品视频 | 日韩精品视频在线免费观看 | 精品一二三四五区 | 黄色www在线观看 | 中文国产在线观看 | 美女视频a美女大全免费下载蜜臀 | 香蕉视频在线免费 | 国产精品第一页在线 | 有码视频在线观看 | 国产福利91精品一区二区三区 | 亚洲视频国产 | 亚洲精品乱码久久久久久高潮 | 亚洲精品视频免费观看 | av官网| a视频在线观看免费 | 97超视频在线观看 | 成人欧美一区二区三区黑人麻豆 | 亚洲精品网址在线观看 | 国产精品一区免费观看 | 国模视频一区二区三区 | 伊人色综合久久天天网 | 日本在线观看中文字幕无线观看 | 亚洲精品国偷自产在线99热 | 免费黄色在线网站 | 天天干天天干天天 | 97视频一区| 美女性爽视频国产免费app | 久久久激情视频 | 综合网天天 | 超碰久热 | 2024国产精品视频 | 九九热视频在线 | 天天干天天做天天操 | www.日韩免费 | 国产精品免费观看网站 | 日本三级久久 | 中文字幕在线资源 | 国产精品剧情在线亚洲 | 韩国在线视频一区 | 丁香一区二区 | 蜜臀av免费一区二区三区 | 国产麻豆精品久久一二三 | 人人爽人人搞 | 毛片精品免费在线观看 | 免费在线电影网址大全 | 黄色毛片网站在线观看 | 中文有码在线视频 | 久久99精品国产麻豆婷婷 | 91精品在线麻豆 | 精品视频一区在线观看 | 精品国产aⅴ一区二区三区 在线直播av | 欧美一区二区三区激情视频 | 精品视频www | 青青草久草在线 | 久久久久看片 | 91九色网站| 色噜噜日韩精品一区二区三区视频 | 中文不卡视频在线 | 国产精品国产精品 | 精品久久99 | 一区二区三区视频网站 | 国产色综合天天综合网 | 国产三级国产精品国产专区50 | 亚洲精品在线视频网站 | 中文字幕在线视频免费播放 | 狠狠成人 | 午夜精品福利一区二区 | 亚洲韩国一区二区三区 | 国精产品永久999 | 91人人澡人人爽 | 99re中文字幕 | 久久99久久精品国产 | 特黄色大片 | 久久黄色网 | 伊人狠狠色| 最新日韩在线观看视频 | 国产精品综合在线 | 欧美激情第十页 | 91视频啪 | 五月婷婷精品 | 麻豆视频免费在线观看 | 在线激情电影 | 成人福利在线观看 | 中文字幕在线视频一区二区 | 成 人 黄 色 视频免费播放 | www.五月天婷婷 | 国产做aⅴ在线视频播放 | 349k.cc看片app | 九九色综合 | 免费男女羞羞的视频网站中文字幕 | 精品免费国产一区二区三区四区 | 天天狠狠操 | 欧美在线视频一区二区三区 | 日本性生活一级片 | 500部大龄熟乱视频使用方法 | 亚洲一区二区三区四区在线视频 | 日本激情中文字幕 | 韩日电影在线免费看 | 欧美少妇xxxxxx | 亚洲网久久 | 亚洲男男gaygay无套同网址 | 国产xxxx性hd极品 | 成人国产精品免费观看 | 国产在线视频资源 | 久久久国产精华液 | 91大神在线观看视频 | 日韩精品在线播放 | 亚洲视频,欧洲视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲午夜av | www日韩视频 | 日日激情 | 开心激情久久 | 视频直播国产精品 | 久久精品一区二区三区中文字幕 | 国产一区免费在线 | 久久黄色精品视频 | 91麻豆免费版 | 久久精品一区八戒影视 | 久久久五月天 | 日韩成年视频 | 99久久一区 | 丁香婷婷久久 | 最近更新好看的中文字幕 | 国产99久久久精品视频 | 国产亚洲情侣一区二区无 | 麻豆一区二区三区视频 | 成人h在线播放 | 一区二区三区免费在线观看视频 | 91中文视频 | 中文一区在线 | 精品福利av | 国产精品自产拍在线观看网站 | 国产精品12345 | av888.com| 国产男女无遮挡猛进猛出在线观看 | av片子在线观看 | 国产精品久久久久久久久久尿 | 黄色av电影免费观看 | 亚洲另类xxxx | 激情视频一区二区三区 | 在线观看免费国产小视频 | 91大神免费在线观看 | 99精品视频免费 | 国产免费观看久久 | 91亚洲夫妻| 91在线一区 | 97视频网址 | 日韩精品久久久久久 | 99精品国产一区二区 | 91男人影院 | 97视频在线观看免费 | 樱空桃av| av中文字幕不卡 | 久久久久免费电影 | 亚洲精品国产精品乱码不99热 | 日韩高清在线不卡 | 六月丁香婷婷网 | 人人干人人做 | 色婷婷影视 | 国产精品精品国产婷婷这里av | 日本中文字幕系列 | 中文字幕免费高清av | 国产精品久久久久久一区二区三区 | 亚洲精品视频网址 | 国产成年人av | 久久久久免费精品视频 | 天天搞天天| 91最新网址 | 国产精品久久久久永久免费看 | 91av免费观看 | 91在线看视频免费 | 一区二区三区高清在线 | 色婷婷久久久综合中文字幕 | 中文字幕麻豆 | 久艹在线观看视频 | 中文字幕乱偷在线 | 日韩理论在线播放 | 中中文字幕av在线 | 欧美中文字幕第一页 | 麻豆成人网 | 欧美伦理一区二区 | 国产亚洲va综合人人澡精品 | 成人日韩av | 伊人久久av | 人人讲 | 精品国产理论片 | 久久久亚洲影院 | 五月天丁香亚洲 | 婷色| 国产精品国产亚洲精品看不卡15 | 天天综合人人 | www.干| 51精品国自产在线 | 欧美色图狠狠干 | 亚洲a网| 欧美激情视频在线免费观看 | 黄网站污 | 91精品福利在线 | 在线观看成人国产 | 免费久草视频 | 亚洲精品va | 91大神精品视频在线观看 | 五月天com | 成人va天堂 | 999国产 | 九九精品视频在线 | 久久99视频免费观看 | 欧美性天天 | av高清一区二区三区 | 国产一区二区三区免费在线 | 久久亚洲欧美 | 樱空桃av | 天天综合天天做天天综合 | 国产免费不卡av | 亚洲激情p | 国产 成人 久久 | 成人久久久电影 | 久草在线免 | 国产手机精品视频 | 青青草国产在线 | 国产精品高清在线 | 国产一级淫片免费看 | 日日综合 | 欧美日韩国产一区二区三区 | 国产精品日韩精品 | 久久99网站 | 香蕉视频国产在线 | 日韩在线欧美在线 | 欧美精品九九99久久 | 免费在线观看中文字幕 | 91夫妻视频 | 黄色字幕网 | 国产91精品久久久久久 | 欧美精品免费在线 | 伊人资源视频在线 | 超碰在线成人 | 久久精品免费播放 | 国产91小视频 | 精品一区二区在线看 | 欧美另类一二三四区 | 99999精品| 日日夜夜免费精品 | 久草干 | 成人一级影视 | 国产精品久久久久久a | 91av电影在线观看 | 黄色小网站免费看 | 国产69精品久久99不卡的观看体验 | 亚洲h在线播放在线观看h | 在线观看日韩精品视频 | 成人高清av在线 | 久久久亚洲影院 | 国产第一福利 | 久久精品影视 | 中文字幕婷婷 | 日韩专区一区二区 | 在线日韩精品视频 | 亚洲天堂网站视频 | 91成人精品 | va视频在线观看 | 国产一级电影在线 | 一级成人免费 | av在线一级 | www.777奇米| 三级小视频在线观看 | 五月婷婷中文网 | 亚洲天堂自拍视频 | 久久99国产综合精品免费 | 99热在线观看 | 久草影视在线 | 欧美日本不卡 | 人人射网站 | 亚洲特级片 | 91av资源网 | 一级黄色在线免费观看 | 成人一级视频在线观看 | 亚洲精品视频播放 | 最新免费av在线 | 久久久久久国产精品 | 最近最新最好看中文视频 | 欧美中文字幕久久 | 久艹在线观看视频 | 午夜骚影 | 国内毛片毛片 | 毛片播放网站 | 色婷婷视频 | 天天色天天操天天爽 | 九草在线视频 | 欧美日韩在线观看一区二区 | 欧美精品一二三 | 国产无限资源在线观看 | 亚洲精品1区2区3区 超碰成人网 | 久久久免费精品国产一区二区 | 欧美热久久 | 国产 成人 久久 | 九九久久影视 | 六月丁香综合 | 日韩精品免费一线在线观看 | 欧美另类69 | 97超碰在线视 | 婷婷国产一区二区三区 | 久久免费视频2 | 国产99一区| 免费在线观看日韩 | 国产精品久久久 | 久草国产视频 | 天堂在线一区二区三区 | 91在线中文 | 97伊人网 | 91爱在线 | 一区二区高清在线 | 天天射天天干 | 97视频入口免费观看 | 日韩精品中文字幕有码 | 一区 二区电影免费在线观看 | 免费网址在线播放 | 色国产视频 | 成人免费xyz网站 | 久久影视精品 | 国产日韩欧美综合在线 | 中文字幕视频一区二区 | 国产伦理精品一区二区 | 99久久99久久综合 | 丁香六月激情 | 成人欧美一区二区三区在线观看 | 久久久久久久久影院 | 日韩伦理一区二区三区av在线 | 91久久精品日日躁夜夜躁国产 | 亚洲视频电影在线 | 91精品专区| 黄污网站在线 | 国产一区二区免费 | 欧美成人精品xxx | 久久这里只有精品视频首页 | 成人午夜电影在线 | 免费三级av | 午夜精品视频免费在线观看 | 色综合久久久久 | 亚洲激情在线视频 | 97在线视| 国产黄色免费观看 | 日日夜夜91 | 亚洲精品国产第一综合99久久 | 国产成人精品久久亚洲高清不卡 | 亚洲精品白浆高清久久久久久 | 69亚洲精品 | 99欧美视频| 综合激情 | 一区二区av | 欧美在线一| 日韩精品视频久久 | 亚洲天天摸日日摸天天欢 | 久久亚洲私人国产精品 | 天天天插| 欧美激情视频一二区 | 国产资源站 | 成年人黄色在线观看 | 97久久精品午夜一区二区 | 99久久精品国产欧美主题曲 | 日韩av电影国产 | 在线视频手机国产 | 在线观看视频国产 | 亚洲国产人午在线一二区 | 欧美成人日韩 | 韩国精品视频在线观看 | 成人精品国产 | 色悠悠久久综合 | 一区二区不卡视频在线观看 | 免费观看一级成人毛片 | 精品一区二区在线免费观看 | 蜜桃视频在线观看一区 | 亚洲资源视频 | 91热在线 | 日韩免费电影一区二区三区 | 久久少妇免费视频 | 欧美一区二区精品在线 | 精品视频在线播放 | 尤物九九久久国产精品的分类 | 综合久久网站 | 久久久99精品免费观看app | 成人av视屏| 国产精品二区三区 | 亚洲人久久久 | 欧美成人h版 | 一区二区三区国 | 91你懂的 | www91在线观看 | 亚洲黄色在线免费观看 | 久久久久婷 | 成人理论在线观看 | 免费在线成人av电影 | av在线看片 | 丁香av | 亚在线播放中文视频 | 亚洲视频资源在线 | 欧美精品小视频 | 天天操天天操天天操 | 麻豆视频网址 | 在线观看视频黄 | 亚州视频在线 | 色偷偷88888欧美精品久久久 | 99久久99久久精品国产片果冰 | 17videosex性欧美 | 亚洲成人黄色在线观看 | 精品国产乱码一区二区三区在线 | 99爱视频| 精品国精品自拍自在线 | 日韩夜夜爽 | 丁香视频免费观看 | 91在线你懂的 | 丰满少妇在线观看资源站 | 97精品国产 | 日韩夜夜爽 | 精品国产一区二区三区久久 | 九九久久精品视频 | 国产专区在线播放 | 国产中文字幕在线看 | 欧美日韩国产一区二 | 久久成人福利 | 99 久久久久 | 国产精品原创 | 一级久久久| 91污在线| 丁香花在线视频观看免费 | 亚洲精品一区二区精华 | 国产精品视频免费看 | 国产123区在线观看 国产精品麻豆91 | 久久久久久国产精品 | 韩国精品福利一区二区三区 | 欧美性生活小视频 | 久久在线免费视频 | 玖玖玖精品 | 亚洲国产剧情 | 青青久草在线 | 日韩中文字幕免费视频 | 香蕉视频亚洲 | 国产成人精品久久久久 | 久久久国产一区二区三区四区小说 | 在线视频婷婷 | 国产午夜精品一区二区三区嫩草 | 国产精品99久久久久久久久 | 伊人中文网 | 免费看国产曰批40分钟 | 国产一区在线播放 | 99精品在线免费观看 | 日韩精品国产一区 | 欧美日韩一级久久久久久免费看 | 激情伊人五月天久久综合 | 特级a毛片 | 色丁香久久 | a一片一级| 五月激情综合婷婷 | 久久国产免费看 | 国产流白浆高潮在线观看 | 日韩黄色大片在线观看 | 精品久久久久久久久中文字幕 | 色婷婷一区 | 国产免费高清 | 五月天六月丁香 | 国精产品一二三线999 | 中文字幕欲求不满 | av成人免费网站 | 免费特级黄毛片 | 2023亚洲精品国偷拍自产在线 | av+在线播放在线播放 | 欧美一级黄色片 | 天堂av在线免费 | 久久成人高清 | 日韩精品一区二区三区水蜜桃 | 激情网在线观看 | 99综合影院在线 | 国产精品乱码久久久久久1区2区 | 日本中文字幕电影在线免费观看 | 国产亚洲婷婷免费 | 亚洲黄色免费电影 | 亚洲精品视频第一页 | 外国av网 | 免费视频在线观看网站 | 免费男女网站 | 色综合天天色 | 黄色精品视频 | 国产高清在线精品 | 麻豆影视在线免费观看 | 欧美日韩视频精品 | 麻豆视频91 | 亚洲成人黄色网址 | 黄色a在线| 亚洲视频综合在线 | 中文国产字幕 | 国产成人精品一区二区三区在线观看 | 婷婷伊人五月 | 久久精品人 | 中文字幕在线乱 | 中文 一区二区 | 精品在线你懂的 | 五月综合激情婷婷 | 亚洲精品激情 | av免费在线免费观看 | 久久久www成人免费毛片麻豆 | 国产裸体永久免费视频网站 | 91成年人网站 | 日本精品久久久久影院 | 午夜视频在线观看一区二区三区 | 日日夜精品| 国产精品久久久久久久久岛 | 久久久免费精品视频 | 99久久er热在这里只有精品15 | 亚洲黄色小说网 | 99九九99九九九视频精品 | av天天澡天天爽天天av | 999电影免费在线观看2020 | 亚洲欧美日韩国产精品一区午夜 | 日韩v欧美v日本v亚洲v国产v | 国产综合香蕉五月婷在线 | 国产午夜精品免费一区二区三区视频 | 久久夜色网 | 国产精品黄色av | 99视屏| 国产精品久久久一区二区 | 欧美91精品国产自产 | 亚洲一级电影在线观看 | 最新中文字幕在线观看视频 | 久久久久久久久久福利 | 亚洲区视频在线观看 | 久久亚洲成人网 | 日日夜夜精品免费观看 | 91精品一区二区三区久久久久久 | 伊人婷婷色| 久久免费视频6 | 91chinesexxx| 一区二区三区电影 | 国内三级在线观看 | av在线播放亚洲 | 亚洲精品福利在线 | 91精品对白一区国产伦 | 91精品国产欧美一区二区成人 | 天天操天天射天天爽 | 亚洲精品视频大全 | 欧美日韩高清一区 | 国产黄色大片 | av丁香花| 成人av.com | www.69xx| 999视频在线播放 | 久久视频精品在线观看 | av日韩国产 | 深夜成人av | 91黄视频在线 | 91精品对白一区国产伦 | 中文字幕av全部资源www中文字幕在线观看 | 91黄在线看 | 九九九九九九精品任你躁 | 成人h动漫精品一区二 | 人人澡人人草 | 亚洲人在线7777777精品 | 欧美日韩另类在线观看 | 欧美日韩性视频在线 | 日批在线看| 日韩精品一区二区三区第95 | 久久精品福利 | 久久综合导航 | 欧美成人精品欧美一级乱黄 | 久久欧美在线电影 | 久久艹国产 | 欧美一级特黄aaaaaa大片在线观看 | 国产精品 视频 | 亚洲精品欧洲精品 | 久久这里只有精品9 | 中文字幕 国产视频 | 三级a毛片 | 国产一区私人高清影院 | 中文字幕在线影院 | 国产视频资源在线观看 | 日韩黄视频| 在线观看www视频 | 国产精品久久99精品毛片三a | 色综合久久久久久久 | 综合网色 | 天天操天操 | www.com操| 2023国产精品自产拍在线观看 | 99视频在线精品 | 午夜三级在线 | 精品美女久久久久久免费 | 91av蜜桃 | 九色91在线视频 | 欧美日韩视频在线一区 | 丝袜美腿亚洲 | 亚洲天天在线 | 美国三级黄色大片 | avav片| 久久精品欧美一区二区三区麻豆 | 久草视频资源 | 少妇bbbb搡bbbb桶 | 久草成人在线 | 亚洲日本在线一区 | 亚州天堂| 在线a人v观看视频 | 国产一区二区三区黄 | 97成人在线观看视频 | 中文字幕一区三区 | 免费日韩在线 | 热久久免费视频 | 国产一区福利在线 | 午夜精品久久久久久久久久 | 国产精品女视频 | 婷婷丁香导航 | 欧美永久视频 | 中文一区在线 | 国产成人三级在线播放 | 欧美一区二区日韩一区二区 | 91精品1区2区| 欧美日韩久久一区 | 91在线免费播放视频 | 97免费视频在线播放 | 亚洲五月婷婷 | 国产在线1区 | 在线播放国产一区二区三区 | 亚洲jizzjizz日本少妇 | 欧美一级视频在线观看 | 综合精品久久久 | 丁香六月久久综合狠狠色 | 最新精品国产 | 成人黄大片视频在线观看 | 国产一级精品在线观看 | 97国产精品视频 | 中文字幕网站 | 婷婷丁香狠狠爱 | 免费观看黄色av | 欧美日韩精品在线视频 | 亚洲天堂网视频 | 日本中文字幕在线电影 | 天天色天天操综合网 | 综合五月婷婷 | 亚洲夜夜综合 | 久久久精品福利视频 | 五月婷婷开心 | 久久er99热精品一区二区 | 免费观看一级 | 婷婷五月情 | 91在线小视频 | 国产精品黄网站在线观看 | 97在线观看 | 亚洲国产精品视频在线观看 | 欧美日韩xx | 国产无套一区二区三区久久 | 中文字幕黄色网 | 久久精品毛片 | 久久久www成人免费精品张筱雨 | 五月婷婷丁香 | 国产91大片| 丝袜护士aⅴ在线白丝护士 天天综合精品 | 欧美9999 | 日本一区二区三区免费看 | 国产精品女主播一区二区三区 | 亚洲最大av在线播放 | 欧美极品一区二区三区 | 日韩成人黄色av | 天天射天天爽 | 一区二区三区 中文字幕 | 欧美极品久久 | 日韩一区二区免费在线观看 | 欧美射射射 | 久久国内精品 | 蜜桃av久久久亚洲精品 | 免费婷婷| 亚洲精品女人久久久 | 日韩在线视频免费播放 | 99av国产精品欲麻豆 | 国产亚洲欧美精品久久久久久 | 日韩欧美精品一区二区三区经典 | 日韩高清在线看 | 久久精品专区 | 欧美精品999 | 日本久久精品 | 久久婷婷国产色一区二区三区 | 欧美日韩一区二区三区视频 | 亚洲乱亚洲乱亚洲 | 国产精品国产三级在线专区 | 美女视频黄网站 | 97超碰香蕉 | 日韩av网址在线 | 亚洲精品字幕在线观看 | 99在线精品视频观看 | 久久久久亚洲天堂 | 精品久久久久久亚洲综合网站 | 在线亚洲午夜片av大片 | 国产91aaa| 蜜臀av性久久久久av蜜臀三区 | 欧美日韩国语 | 天天搞天天 | 久草在线免费在线观看 | 国产剧在线观看片 | 国产高清视频在线免费观看 | 成在线播放 | 亚洲一区二区三区四区精品 | 久草视频中文 | 久久涩视频| 日韩动漫免费观看高清完整版在线观看 | 最近中文字幕国语免费高清6 | 97超碰成人在线 | 麻豆精品传媒视频 | 91九色蝌蚪| 国产黄色片一级三级 | 国产精品理论在线观看 | 亚洲国产精彩中文乱码av | 黄色影院在线免费观看 | 亚洲国产精品成人综合 | 一区二区三区免费 | 91精品久久久久久久久久入口 | 精品在线小视频 | 黄色片网站大全 | 91久久久久久久一区二区 | 国产三级av在线 | 97精品国自产拍在线观看 | 99精品免费久久久久久日本 | 天天操天天射天天 | 九九热精品国产 | 99久久精品日本一区二区免费 | av片子在线观看 | 九九色视频 | 日韩欧美精品一区二区 | 精品女同一区二区三区在线观看 | 99中文视频在线 | 日韩视频一区二区在线 | 黄色日本免费 | 亚洲精品午夜aaa久久久 | 亚洲国产视频直播 | 欧美夫妻性生活电影 | 精品久久久久久国产 | 久久综合九九 | 成人在线视频论坛 | 一区二区视 | 亚洲视频精选 | 精品96久久久久久中文字幕无 | 久久久久久国产精品美女 | 插插插色综合 | 国产一区在线视频观看 | 久久草草热国产精品直播 | 日韩在线三区 | 久热国产视频 | 欧美性生活免费 | 久久经典国产 | 欧美在线一二区 | 成人资源在线播放 | 久久免费视频一区 | 成人avav | 亚洲国产影院av久久久久 | 欧美一区二区三区特黄 | 欧美一级在线看 | 欧美精品久久久久久久免费 | 在线观看视频在线 | 久久精品视频观看 | 国产福利av | 综合久久久久 | 1000部国产精品成人观看 | 91av小视频 | 免费看一级黄色大全 | 久久久免费毛片 | 国产丝袜 | 国产精品不卡在线播放 | www免费看片com | 亚洲3级| 久99久中文字幕在线 | 97成人资源站 | 久久在线免费 | 久久精品视频日本 | av电影免费在线看 | 国产成人精品免高潮在线观看 | 成人av电影免费在线观看 | 人人插人人射 | 最近最新最好看中文视频 | 日韩精品视频在线免费观看 | 国产成人av一区二区三区在线观看 | 深爱开心激情网 | 国产精品久久久久久久久免费 | 国产色婷婷精品综合在线手机播放 | 毛片精品免费在线观看 | 91在线观看视频网站 | 91精品久久久久久 | 欧美亚洲国产日韩 | 欧美色图东方 | 久久久久成人免费 | 亚洲欧洲精品视频 | 日日夜夜操av | 国产精品成 | 高清精品视频 | 国产精品久久久影视 | 国产精品黑丝在线观看 | 麻豆视频成人 | 日韩天天综合 | 夜夜嗨av色一区二区不卡 | 中文字幕日本特黄aa毛片 | 天天激情综合网 | 天天色棕合合合合合合 | 日韩极品在线 | 国内小视频在线观看 | 五月天久久久久久 | 麻豆传媒视频在线 | 欧美另类调教 | 四虎永久免费 | 亚洲免费精彩视频 | www.夜夜操.com| 超碰人人草 | 色av婷婷 | 国产精品永久 | 超碰在线日韩 | 日韩av一区二区三区四区 | 成人av网站在线观看 | 国产精品美女久久久久久免费 | 日韩免费视频观看 | 久久综合色天天久久综合图片 | 欧美黄污视频 | 国产成人久久77777精品 | 91欧美视频网站 | 日韩在线免费视频 | 免费91麻豆精品国产自产在线观看 | 狠狠的日日 | 中文乱码视频在线观看 | 久久这里只有精品久久 | 亚洲精品久久久久999中文字幕 | 黄色日本免费 | 91av视频在线播放 | 国产九色在线播放九色 | 天天操天天操天天操 | 久久麻豆视频 | 亚洲日本三级 | 国内揄拍国内精品 | 91麻豆免费视频 | 国产免费小视频 | 日韩精品不卡在线 | 国产精品久久久久久久久大全 | 激情 一区二区 | 日韩中文字幕免费在线观看 | 日韩久久精品一区二区三区下载 | 亚洲成人资源在线观看 | 免费99视频 | 五月婷亚洲 | 免费久久久 | 国产亚洲人成网站在线观看 | 69热国产视频 | 亚洲欧美偷拍另类 | 免费福利片2019潦草影视午夜 | www.人人干| 天天干天天草天天爽 | 久草网在线 | 久久99亚洲网美利坚合众国 | 欧美电影黄色 | 9在线观看免费高清完整版在线观看明 | 9久久精品| 亚洲综合视频在线 | 天天操操操操操操 | 婷婷五月色综合 | 色婷婷亚洲精品 | 日韩性xxxx | 四虎成人网 | 久久一区精品 | 免费高清在线视频一区· | www国产亚洲精品久久麻豆 | 国产在线精品观看 | 国产免费一区二区三区最新6 | 黄色美女免费网站 | 亚洲精品无 | 亚洲视频在线播放 | 黄色精品国产 | 特级片免费看 | av片子在线观看 | 亚洲精品高清在线 | 97人人澡人人爽人人模亚洲 | 欧美成人中文字幕 | 在线观看日本韩国电影 | www.色com | 久久嗨| 天天摸日日摸人人看 | 亚洲国产日韩在线 | 黄色网址国产 | 国产一级特黄电影 | 国产精品亚洲成人 | 国产精品6| 九九视频免费观看视频精品 | 国产精品一区二区免费 | 国产精品免费一区二区三区 | 国产在线999| 在线视频中文字幕一区 | 欧美性色xo影院 | 一区 二区电影免费在线观看 | 丁香婷婷综合激情五月色 | 激情久久久久久久久久久久久久久久 | 欧美性免费 | 黄色av电影免费观看 | 国产伦精品一区二区三区四区视频 |