答:
答:
template <typename T>
int compare(const T &v1, const T &v2){
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
答:
答:
#include <iostream>
#include <vector>
#include <list>
#include <string>
// find模板函数
template <typename Iterator, typename Value>
Iterator find(Iterator first, Iterator last, const Value& val) {
while (first != last) {
if (*first == val) {
return first;
}
++first;
}
return last;
}
int main() {
// 在vector<int>中查找
std::vector<int> v = { 1, 2, 3, 4, 5 };
auto it_v = ::find(v.begin(), v.end(), 3);
if (it_v != v.end()) {
std::cout << "Found in vector: " << *it_v << std::endl;
} else {
std::cout << "Not found in vector." << std::endl;
}
// 在list<string>中查找
std::list<std::string> l = { "hello", "world", "test", "find" };
auto it_l = ::find(l.begin(), l.end(), std::string("test"));
if (it_l != l.end()) {
std::cout << "Found in list: " << *it_l << std::endl;
} else {
std::cout << "Not found in list." << std::endl;
}
return 0;
}
答:
#include <iostream>
#include <string>
// 模板函数,接受任意大小、任意元素类型的数组引用
template <typename T, size_t N>
void print(const T(&arr)[N]) {
for (const auto& elem : arr) {
std::cout << elem << std::endl;
}
}
int main() {
int arrInt[] = { 1, 2, 3, 4, 5 };
print(arrInt); // 打印int数组
std::string arrStr[] = { "hello", "world", "template" };
print(arrStr); // 打印string数组
return 0;
}
答:
// 自定义 begin 函数
template <typename T, size_t N>
T* begin(T(&arr)[N]) {
return &arr[0];
}
// 自定义 end 函数
template <typename T, size_t N>
T* end(T(&arr)[N]) {
return &arr[N];
}
答:
// constexpr模板函数,用于计算数组大小
template <typename T, size_t N>
constexpr size_t arraySize(const T(&)[N]) {
return N;
}
答:
答:
答:
template <typename elemType> class ListItem;
template <typename elemType> class List {
public:
List<elemType>();
List<elemType>(const List<elemType> &);
List<elemType>& operator=(const List<elemType> &);
~List();
void insert(ListItem *ptr, elemType value);
private:
ListItem *front, *end;
};
答:
template <typename elemType> class ListItem;
template <typename elemType>
class List {
public:
List();
List(const List<elemType> &);
List<elemType>& operator=(const List<elemType> &);
~List();
void insert(ListItem<elemType> *ptr, elemType value);
private:
ListItem<elemType> *front, *end;
};
答:
#include <iostream>
#include <string>
#include <vector>
#include <initializer_list>
#include <memory>
using namespace std;
template <typename T>
class BlobPtr;
template <typename T>
class Blob {
public:
friend class BlobPtr<T>;
friend bool operator==<T> (const Blob<T>&, const Blob<T>&);
friend bool operator!=<T> (const Blob<T>&, const Blob<T>&);
typedef typename std::vector<T>::size_type size_type;
Blob() : data(make_shared<vector<T>>()) { }
Blob(initializer_list<T> il) : data(make_shared<vector<T>>(il)) { }
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
// 添加和删除元素
void push_back(const T& t) { data->push_back(t); }
void pop_back() {
check(0, "pop_back on empty Blob");
data->pop_back();
}
// 元素访问
T& back() {
check(0, "back on empty Blob");
return data->back();
}
const T& back() const {
check(0, "back on empty Blob");
return data->back();
}
T& operator[](size_t n) {
check(n, "subscript out of range");
return data->at(n);
}
const T& operator[](size_t n) const {
check(n, "subscript out of range");
return data->at(n);
}
private:
shared_ptr<vector<T>> data;
void check(size_type i, const string &msg) const {
if (i >= data->size()) {
throw out_of_range(msg);
}
}
};
template <typename T>
bool operator==(const Blob<T>& lhs, const Blob<T>& rhs) {
return lhs.data == rhs.data;
}
template <typename T>
bool operator!=(const Blob<T>& lhs, const Blob<T>& rhs) {
return !(lhs == rhs);
}
template <typename T>
class BlobPtr {
public:
BlobPtr() : curr(0) { }
BlobPtr(Blob<T> &a, size_t sz = 0) : wptr(a.data), curr(sz) { }
T& operator*() const {
auto p = check(curr, "dereference past end");
return (*p)[curr];
}
// 递增和递减
BlobPtr& operator++() {
check(curr, "increment past end of BlobPtr");
++curr;
return *this;
}
BlobPtr& operator--() {
--curr;
check(curr, "decrement past begin of BlobPtr");
return *this;
}
BlobPtr operator++(int) {
BlobPtr ret = *this;
++*this;
return ret;
}
BlobPtr operator--(int) {
BlobPtr ret = *this;
--*this;
return ret;
}
private:
std::shared_ptr<std::vector<T>> check(std::size_t i, const std::string& msg) const {
auto ret = wptr.lock();
if (!ret) {
throw std::runtime_error("unbound BlobPtr");
}
if (i >= ret->size()) {
throw std::out_of_range(msg);
}
return ret;
}
std::weak_ptr<std::vector<T>> wptr;
std::size_t curr;
};
答:
答:
#include <iostream>
#include <string>
template <std::string::size_type H, std::string::size_type W>
class Screen {
public:
typedef std::string::size_type pos;
Screen() = default;
Screen(char c) : contents(H * W, c) {}
char get() const { return contents[cursor]; }
char get(pos row, pos column) const { return contents[row * W + column]; }
Screen& move(pos row, pos column) {
cursor = row * W + column;
return *this;
}
private:
pos cursor = 0;
std::string contents;
};
答:
template <std::string::size_type H, std::string::size_type W>
class Screen {
// ... 其他成员 ...
friend std::ostream& operator<<(std::ostream& os, const Screen<H, W>& screen) {
// 直接访问 Screen 的私有成员 contents
os << screen.contents;
return os;
}
friend std::istream& operator>>(std::istream& is, Screen<H, W>& screen) {
std::string input;
is >> input;
// 确保输入的长度不超过屏幕的容量
input.resize(H * W, ' '); // 如果输入太短,用空格填充
screen.contents = input;
return is;
}
// ... 其他成员 ...
};
答:
#define _SCL_SECURE_NO_WARNINGS
#include <string>
#include <memory>
using namespace std;
template <typename T>
class Vec {
public:
Vec() : elements(nullptr), first_free(nullptr), cap(nullptr) {}
Vec(const Vec&); // 拷贝构造函数
Vec &operator=(const Vec&); // 拷贝赋值运算符
~Vec(); // 析构函数
void push_back(const T&); // 拷贝元素
size_t size() const { return first_free - elements; }
size_t capacity() const { return cap - elements; }
T *begin() const { return elements; }
T *end() const { return first_free; }
void reserve(size_t n);
void resize(size_t n, const T& t = T());
private:
std::allocator<T> alloc; // 分配元素
void chk_n_alloc() { if (size() == capacity()) reallocate(); }
std::pair<T*, T*> alloc_n_copy(const T*, const T*);
void free(); // 销毁元素并释放内存
void reallocate(); // 获得更多内存并拷贝已有元素
T *elements; // 指向数组首元素的指针
T *first_free; // 指向数组第一个空闲元素的指针
T *cap; // 指向数组尾后位置的指针
};
template <typename T>
void Vec<T>::push_back(const T& t) {
chk_n_alloc();
alloc.construct(first_free++, t);
}
template <typename T>
std::pair<T*, T*> Vec<T>::alloc_n_copy(const T *b, const T *e) {
auto data = alloc.allocate(e - b);
return{ data, std::uninitialized_copy(b, e, data) };
}
template <typename T>
void Vec<T>::free() {
if (elements) {
for (auto p = first_free; p != elements; )
alloc.destroy(--p);
alloc.deallocate(elements, cap - elements);
}
}
template <typename T>
Vec<T>::Vec(const Vec &s) {
auto newdata = alloc_n_copy(s.begin(), s.end());
elements = newdata.first;
first_free = cap = newdata.second;
}
template <typename T>
Vec<T>::~Vec() { free(); }
template <typename T>
Vec<T> &Vec<T>::operator=(const Vec &rhs) {
auto data = alloc_n_copy(rhs.begin(), rhs.end());
free();
elements = data.first;
first_free = cap = data.second;
return *this;
}
template <typename T>
void Vec<T>::reallocate() {
auto newcapacity = size() ? 2 * size() : 1;
auto newdata = alloc.allocate(newcapacity);
auto dest = newdata;
auto elem = elements;
for (size_t i = 0; i != size(); ++i)
alloc.construct(dest++, std::move(*elem++));
free();
elements = newdata;
first_free = dest;
cap = elements + newcapacity;
}
template <typename T>
void Vec<T>::reserve(size_t n) {
if (n <= capacity()) return;
auto newdata = alloc.allocate(n);
auto dest = newdata;
auto elem = elements;
for (size_t i = 0; i != size(); ++i)
alloc.construct(dest++, std::move(*elem++));
free();
elements = newdata;
first_free = dest;
cap = elements + n;
}
template <typename T>
void Vec<T>::resize(size_t n, const T& t) {
if (n < size()) {
while (first_free != elements + n)
alloc.destroy(--first_free);
} else if (n > size()) {
while (size() != n)
push_back(t);
}
}
答:
(a) template <typename T, U, typename V> void f1(T, U, V);
(b) template <typename T> T f2(int &T);
(c) inline template <typename T> T foo(T, unsigned int*);
(d) template <typename T> f4(T, T);
(e) typedef char Ctype;
template <typename Ctype> Ctype f5(Ctype a);
答:
答:
// 对于list,这种索引访问是不适用的。
template <typename Container>
void printContainer(const Container& c) {
// 使用容器的 size_type 来控制循环
typename Container::size_type i = 0;
auto size = c.size();
for (; i < size; ++i) {
std::cout << c[i] << " ";
}
}
答:
template <typename Container>
void printContainer(const Container& c) {
for (auto it = c.begin(); it != c.end(); ++it) {
std::cout << *it << " ";
}
}
答:
// 函数对象类,对给定指针执行 delete
class DebugDelete {
public:
DebugDelete(std::ostream &s = std::cerr) : os(s) { }
// 与任何函数模板相同,T的类型由编译器推断
template <typename T> void operator()(T *p) const {
os << "deleting unique_ptr" << std::endl; delete p;
}
private:
std::ostream &os;
};
答:
TextQuery::TextQuery(ifstream &is) : file(new vector<string>, DebugDelete()) {/* . . . */}
答:
答:
template <typename T> // 类的类型参数
template <typename It> // 构造函数的类型参数
Blob<T>::Blob(It b, It e) : data(std::make_shared<std::vector<T>>(b, e)) {}
extern template class vector<string>;
template class vector<Sales_data>;
答:
答:
template <typename T> class Stack { };
void f1(Stack<char>); // (a)
class Exercise {
Stack<double> &rsd; // (b)
Stack<int> si; // (c)
};
int main() {
Stack<char> *sc; // (d)
f1(*sc); // (e)
int iObj = sizeof(Stack< string >); // (f)
}
答:
答:
#include <functional> // 用于 std::function
template <typename T>
class SharedPtr {
private:
T* ptr;
int* count;
std::function<void(T*)>* deleter;
void release() {
if (ptr && --(*count) == 0) {
(*deleter)(ptr);
delete count;
delete deleter;
}
}
public:
// 构造函数,接受一个可调用对象作为删除器
explicit SharedPtr(T* p = nullptr, std::function<void(T*)> d = [](T* ptr) { delete ptr; })
: ptr(p), count(new int(1)), deleter(new std::function<void(T*)>(d)) {}
// 拷贝构造函数
SharedPtr(const SharedPtr& other)
: ptr(other.ptr), count(other.count), deleter(other.deleter) {
(*count)++;
}
// 拷贝赋值运算符
SharedPtr& operator=(const SharedPtr& other) {
if (this != &other) {
release();
ptr = other.ptr;
count = other.count;
deleter = other.deleter;
(*count)++;
}
return *this;
}
// 解引用
T& operator*() const { return *ptr; }
// 成员访问
T* operator->() const { return ptr; }
// 获取原始指针
T* get() const { return ptr; }
// 析构函数
~SharedPtr() {
release();
}
};
template <typename T, typename Deleter = std::default_delete<T>>
class UniquePtr {
private:
T* ptr;
Deleter deleter;
public:
explicit UniquePtr(T* p = nullptr, const Deleter& d = Deleter())
: ptr(p), deleter(d) {}
// 禁止拷贝和赋值
UniquePtr(const UniquePtr&) = delete;
UniquePtr& operator=(const UniquePtr&) = delete;
// 移动构造函数
UniquePtr(UniquePtr&& other): ptr(other.ptr), deleter(std::move(other.deleter)) {
other.ptr = nullptr;
}
// 移动赋值运算符
UniquePtr& operator=(UniquePtr&& other) {
if (this != &other) {
deleter(ptr);
ptr = other.ptr;
deleter = std::move(other.deleter);
other.ptr = nullptr;
}
return *this;
}
// 解引用
T& operator*() const { return *ptr; }
// 成员访问
T* operator->() const { return ptr; }
// 获取原始指针
T* get() const { return ptr; }
// 释放所有权
T* release() {
T* temp = ptr;
ptr = nullptr;
return temp;
}
// 替换管理的对象
void reset(T* p = nullptr) {
deleter(ptr);
ptr = p;
}
// 析构函数
~UniquePtr() {
deleter(ptr);
}
};
答:
#include <functional> // 用于 std::function
#include <iostream>
#include <string>
#include <vector>
#include <initializer_list>
using namespace std;
class StrBlob {
public:
typedef vector<string>::size_type size_type;
StrBlob() : data(new vector<string>()) { }
StrBlob(initializer_list<string> il) : data(new vector<string>(il)) { }
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
// 添加和删除元素
void push_back(const string &t) { data->push_back(t); }
void pop_back() {
check(0, "pop_back on empty StrBlob");
data->pop_back();
}
// 元素访问
string& front() {
// 如果 vector 为空,check 会抛出一个异常
check(0, "front on empty StrBlob");
return data->front();
}
string& back() {
check(0, "back on empty StrBlob");
return data->back();
}
string& front()const {
check(0, "front on empty StrBlob");
return data->front();
}
string& back()const {
check(0, "back on empty StrBlob");
return data->back();
}
private:
SharedPtr<vector<string>> data;
// 如果 data[i]不合法,抛出一个异常
void check(size_type i, const string &msg) const {
if (i >= data->size()) {
throw out_of_range(msg);
}
}
};
答:
int main() {
StrBlob b1;
{
StrBlob b2 = { "a", "an", "the" };
b1 = b2;
b2.push_back("about");
}
cout << b1.back() << endl;
return 0;
}
答:
答:
答:
template <class T> int compare(const T&, const T&);
(a) compare("hi", "world");
(b) compare("bye", "dad");
答:
template <typename T> T calc(T, int);
template <typename T> T fcn(T, T);
double d; float f; char c;
(a) calc(c, 'c');
(b) calc(d, f);
(c) fcn(c, 'c');
(d) fcn(d, f);
答:
template <typename T> f1(T, T);
template <typename T1, typename T2> f2(T1, T2);
int i = 0, j = 42, *p1 = &i, *p2 = &j;
const int *cp1 = &i, *cp2 = &j;
(a) f1(p1, p2);
(b) f2(p1, p2);
(c) f1(cp1, cp2);
(d) f2(cp1, cp2);
(e) f1(p1, cp1);
(f) f2(p1, cp1);
答:
答:
int i = 5;
double d = 6.7;
auto result = std::max<double>(i, d); // 显式指定模板参数为double
答:
答:
int result = compare<std::string>("hello", "world");
template <typename It>
auto fcn3(It beg, It end) -> decltype(*beg + 0)
{
// 处理序列
return *beg; // 返回序列中一个元素的拷贝
}
答:
答:
template <typename T1, typename T2>
auto sum(const T1& a, const T2& b) -> decltype(a + b) {
return a + b;
}
template <typename T> void g(T&& val);
int i = 0; const int ci = i;
(a) g(i);
(b) g(ci);
(c) g(i * ci);
答:
答:
答:
template <typename T> void g(T&& val) { vector<T> v; }
答:
for (size_t i = 0; i != size(); ++i)
alloc.construct(dest++, std::move(*elem++));
答:
答:
#include <iostream>
using namespace std;
template <typename F, typename T1, typename T2>
void flip(F f, T1 &&t1, T2 &&t2){
f(std::forward<T2>(t2), std::forward<T1>(t1));
}
void g(int &&i, int& j){
cout << i << " " << j << endl;
}
int main() {
int i = 9;
flip(g, i, 42);
return 0;
}
答:
template <typename T> string debug_rep(const T &t){
ostringstream ret;
ret << t;
return ret.str();
}
template <typename T> string debug_rep(T *p){
ostringstream ret;
ret << "pointer: " << p;
if (p)
ret << " " << debug_rep(*p);
else
ret << " null pointer";
return ret.str();
}
template <typename T> void f(T);
template <typename T> void f(const T*);
template <typename T> void g(T);
template <typename T> void g(T*);
int i = 42, *p = &i;
const int ci = 0, *p2 = &ci;
g(42); g(p); g(ci); g(p2);
f(42); f(p); f(ci); f(p2);
答:
答:
#include <iostream>
template <typename T> void f(T) {
std::cout << "f(T) called\n";
}
template <typename T> void f(const T*) {
std::cout << "f(const T*) called\n";
}
template <typename T> void g(T) {
std::cout << "g(T) called\n";
}
template <typename T> void g(T*) {
std::cout << "g(T*) called\n";
}
int main() {
int i = 42, *p = &i;
const int ci = 0, *p2 = &ci;
g(42); g(p); g(ci); g(p2);
f(42); f(p); f(ci); f(p2);
return 0;
}
答:
答:
#include <iostream>
#include <string>
using namespace std;
template <typename T, typename... Args>
void foo(const T &t, const Args& ... rest) {
cout << sizeof...(Args) << endl;
cout << sizeof...(rest) << endl;
}
int main() {
int i = 0; double d = 3.14; string s = "how now brown cow";
foo(i, s, 42, d);
foo(s, 42, "hi");
foo(d, s);
foo("hi");
return 0;
}
答:
#include <iostream>
#include <string>
using namespace std;
template<typename T>
ostream &print(ostream &os, const T &t){
return os << t;
}
template <typename T, typename... Args>
ostream &print(ostream &os, const T &t, const Args&... rest) {
os << t << ", ";
return print(os, rest...);
}
int main() {
int i = 0; double d = 3.14; string s = "how now brown cow";
print(cout, 9);
cout << endl;
print(cout, "AAA", 99);
cout << endl;
print(cout,i,d,s,"BBB",42);
return 0;
}
答:
答:
答:
template <typename T>
ostream &print(ostream &os, const T &t) {
return os << t;
}
template <typename T, typename... Args>
ostream &print(ostream &os, const T &t, const Args&... rest) {
os << t << ", ";
return print(os, rest...);
}
template <typename T>
string debug_rep(const T &t){
ostringstream ret;
ret << t;
return ret.str();
}
template <typename... Args>
ostream &errorMsg(ostream &os, const Args&... rest) {
return print(os, debug_rep(rest)...);
}
答:
答:
template <class... Args>
inline void StrVec::emplace_back(Args&&... args){
chk_n_alloc(); // 如果需要的话重新分配 StrVec 内存空间
alloc.construct(first_free++,
std::forward<Args>(args)...);
}
答:
答:
答:
template<typename T, typename... Args>
std::shared_ptr<T> make_shared(Args&&... args) {
// 使用new表达式创建一个T类型的对象,利用std::forward<Args>(args)...来完美转发参数
return std::shared_ptr<T>(new T(std::forward<Args>(args)...));
}
答:
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
struct Sales_data {
friend std::hash<Sales_data>;
friend bool operator==(const Sales_data& lhs, const Sales_data& rhs);
friend std::ostream &operator<<(std::ostream& os, const Sales_data& item);
Sales_data() = default;
Sales_data(const std::string &s) :bookNo(s) {}
Sales_data(const std::string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(p*n) {}
std::string isbn() const {
return bookNo;
}
Sales_data& combine(const Sales_data& rhs) {
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
private:
double avg_price() const {
if (units_sold) {
return revenue / units_sold;
} else {
return 0;
}
}
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
bool operator==(const Sales_data &lhs, const Sales_data &rhs) {
return lhs.isbn() == rhs.isbn() &&
lhs.units_sold == rhs.units_sold &&
lhs.revenue == rhs.revenue;
}
ostream &operator<<(ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
namespace std {
template <>
struct hash<Sales_data> {
typedef size_t result_type;
typedef Sales_data argument_type;
size_t operator()(const Sales_data& s) const;
};
size_t hash<Sales_data>::operator()(const Sales_data& s) const{
return hash<string>()(s.bookNo) ^
hash<unsigned>()(s.units_sold) ^
hash<double>()(s.revenue);
}
}
int main() {
unordered_multiset<Sales_data> umset;
umset.emplace("Aaa", 10, 0.9);
umset.emplace("Bbb", 20, 0.8);
for (const auto &item : umset) {
cout << item << endl;
}
return 0;
}
答:
#include <vector>
#include <iostream>
#include <string>
// 函数模板定义
template<typename T>
size_t count_occurrences(const std::vector<T>& vec, const T& value) {
size_t count = 0;
for (const auto& item : vec) {
if (item == value) {
++count;
}
}
return count;
}
// 测试函数
int main() {
// 测试double类型的vector
std::vector<double> vecDouble = { 1.1, 2.2, 3.3, 1.1, 4.4 };
double valDouble = 1.1;
std::cout << "Double vector: " << count_occurrences(vecDouble, valDouble) << " occurrences of " << valDouble << std::endl;
// 测试int类型的vector
std::vector<int> vecInt = { 1, 2, 3, 4, 5, 1, 1 };
int valInt = 1;
std::cout << "Int vector: " << count_occurrences(vecInt, valInt) << " occurrences of " << valInt << std::endl;
// 测试string类型的vector
std::vector<std::string> vecString = { "apple", "banana", "cherry", "apple", "date", "apple" };
std::string valString = "apple";
std::cout << "String vector: " << count_occurrences(vecString, valString) << " occurrences of " << valString << std::endl;
return 0;
}
答:
#include <vector>
#include <iostream>
#include <cstring>
// 原始模板定义
template<typename T>
size_t count_occurrences(const std::vector<T>& vec, const T& value) {
size_t count = 0;
for (const auto& item : vec) {
if (item == value) {
++count;
}
}
return count;
}
// 针对 const char* 的特例化版本
template<>
size_t count_occurrences<const char*>(const std::vector<const char*>& vec, const char* const& value) {
size_t count = 0;
for (const auto& item : vec) {
if (strcmp(item, value) == 0) {
++count;
}
}
return count;
}
// 测试程序
int main() {
// 使用特例化版本处理vector<const char*>
std::vector<const char*> vecCharPtr = { "apple", "banana", "cherry", "apple", "date", "apple" };
const char* valCharPtr = "apple";
std::cout << "const char* vector: " << count_occurrences(vecCharPtr, valCharPtr) <<
" occurrences of " << valCharPtr << std::endl;
system("pause");
return 0;
}
答:
template <typename T>
string debug_rep(T* p) {
ostringstream ret;
ret << p;
return ret.str();
}
template <>
string debug_rep(char *p) {
return string(p);
}
template <>
string debug_rep(const char *p) {
return string(p);
}
答:
答:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务