string.pop_back源码
时间: 2024-05-12 15:13:06 浏览: 83
string.pop_back() 函数用于从字符串的末尾删除一个字符。
以下是 C++ 中 string.pop_back() 函数的源代码实现:
```cpp
void pop_back()
{
if (!empty())
erase(size() - 1);
}
```
该函数首先检查字符串是否为空。如果不为空,则调用 erase() 函数删除字符串中的最后一个字符,使用的是 size() 函数获取字符串的长度减去 1 的位置。
注意,该函数只能用于 C++11 及以上版本。在 C++11 之前的版本中,该函数不存在。
相关问题
black jack c++源码
以下是一个简单的黑杰克(Blackjack)游戏的 C++ 源代码示例:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <ctime>
#include <algorithm>
using namespace std;
// 卡牌结构体
struct Card {
enum Rank { ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING };
enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
Rank rank;
Suit suit;
// 重载输出运算符
friend ostream& operator<<(ostream& os, const Card& card) {
const string rankNames[] = { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
const string suitNames[] = { "Clubs", "Diamonds", "Hearts", "Spades" };
return os << rankNames[card.rank] << " of " << suitNames[card.suit];
}
// 获取卡牌点数
int getValue() const {
if (rank >= TEN) {
return 10;
} else {
return rank;
}
}
};
// 卡牌组
class Deck {
public:
// 构造函数
Deck() {
m_Cards.reserve(52);
for (int s = Card::CLUBS; s <= Card::SPADES; ++s) {
for (int r = Card::ACE; r <= Card::KING; ++r) {
m_Cards.push_back(Card(static_cast<Card::Rank>(r), static_cast<Card::Suit>(s)));
}
}
}
// 洗牌
void shuffle() {
random_shuffle(m_Cards.begin(), m_Cards.end());
}
// 发一张牌
Card dealCard() {
Card card = m_Cards.back();
m_Cards.pop_back();
return card;
}
private:
vector<Card> m_Cards;
};
// 玩家类
class Player {
public:
// 构造函数
Player(const string& name = "") :
m_Name(name), m_Score(0) {}
// 添加一张牌
void addCard(const Card& card) {
m_Hand.push_back(card);
m_Score += card.getValue();
}
// 是否爆牌
bool isBusted() const {
return m_Score > 21;
}
// 重置手牌
void clearHand() {
m_Hand.clear();
m_Score = 0;
}
// 获取分数
int getScore() const {
return m_Score;
}
// 获取名称
const string& getName() const {
return m_Name;
}
// 重载输出运算符
friend ostream& operator<<(ostream& os, const Player& player) {
os << player.m_Name << ":\n";
for (auto& card : player.m_Hand) {
os << " " << card << endl;
}
os << " Score: " << player.m_Score << endl;
return os;
}
private:
string m_Name;
vector<Card> m_Hand;
int m_Score;
};
// 游戏类
class BlackjackGame {
public:
// 构造函数
BlackjackGame() {
srand(static_cast<unsigned int>(time(0)));
}
// 开始游戏
void play() {
m_Deck.shuffle();
m_House.addCard(m_Deck.dealCard());
m_House.addCard(m_Deck.dealCard());
m_Player.addCard(m_Deck.dealCard());
m_Player.addCard(m_Deck.dealCard());
while (true) {
cout << m_House << endl;
cout << m_Player << endl;
if (m_Player.isBusted()) {
cout << "You busted! You lose!" << endl;
break;
}
cout << "Do you want to hit? (y/n): ";
char choice;
cin >> choice;
if (choice == 'y' || choice == 'Y') {
m_Player.addCard(m_Deck.dealCard());
} else {
while (m_House.getScore() < 17) {
m_House.addCard(m_Deck.dealCard());
}
cout << m_House << endl;
if (m_House.isBusted()) {
cout << "The house busted! You win!" << endl;
} else if (m_House.getScore() > m_Player.getScore()) {
cout << "The house wins!" << endl;
} else if (m_House.getScore() < m_Player.getScore()) {
cout << "You win!" << endl;
} else {
cout << "It's a tie!" << endl;
}
break;
}
}
m_House.clearHand();
m_Player.clearHand();
}
private:
Deck m_Deck;
Player m_House{ "The House" };
Player m_Player{ "You" };
};
int main() {
BlackjackGame game;
game.play();
return 0;
}
```
这是一个简单的命令行版黑杰克游戏,其中包含卡牌、卡牌组、玩家和游戏类等基本结构。游戏在开始时首先洗牌,并给庄家和玩家发两张牌。然后轮流询问玩家是否要继续要牌,直到他停止或爆牌。接着庄家会发牌,直到他的分数大于等于 17。最后根据分数判断胜负,并清空手牌准备下一轮游戏。
erase()函数源码
erase()函数是C++ STL中的一个函数,用于删除容器中的元素。下面是它的源码实现:
```cpp
iterator erase(const_iterator position)
{
difference_type offset = position - cbegin();
if (offset < 0 || offset >= static_cast<difference_type>(size()))
throw std::out_of_range("vector::erase");
pointer p = data() + offset;
std::move(p + 1, end(), p);
pop_back();
return begin() + offset;
}
```
该函数接收一个迭代器参数position,表示要删除的元素的位置。该函数首先计算出该位置与开头迭代器之间的距离offset,然后检查offset是否为负数或超出容器大小,若是则抛出std::out_of_range异常。
接下来,该函数通过指针p获取要删除的元素的地址,并将p之后的元素移动到p的位置上,然后通过pop_back()函数删除最后一个元素。最后,该函数返回一个迭代器,指向已删除元素的下一个元素。
需要注意的是,该函数只能用于可变容器,如std::vector、std::deque等,而不能用于不可变容器,如std::array、std::string等。
阅读全文