4.4 C++ Boost 数据集序列化库
Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开发过程,提高代码质量和性能,并且可以适用于多种不同的系统平台和编译器。Boost库已被广泛应用于许多不同领域的C++应用程序开发中,如网络应用程序、图像处理、数值计算、多线程应用程序和文件系统处理等。
Boost库提供了一组通用的数据序列化和反序列化库,包括archive、text_oarchive、text_iarchive、xml_oarchive、xml_iarchive等。可用于许多数据类型的持久化和传输。使用这些库,我们可以轻松地将各种数据类型序列化到文件或流中,并从文件或流中反序列化数据。
4.1 针对文本的序列化
文本序列化是将程序中的数据结构以文本的形式进行编码并持久化的过程,以便在需要时可以进行解码并重新构造出这个数据结构。在实际开发中,我们经常需要使用文本序列化技术来保存程序状态、交换数据以及网络传输等。
Boost库中提供了一组非常方便的序列化工具来处理各种类型的序列化,这些工具可以轻松地将数据从内存中打包创建成字符串,反序列化则是反之。针对文本的序列化技术还可为数据结构提供良好的兼容性,可以用于跨操作系统和语言的数据序列化。
#include <iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
void txt_save(std::string path,std::string save_string)
{
std::ofstream ptr(path);
boost::archive::text_oarchive archive(ptr);
std::string string = save_string;
archive << string;
}
std::string txt_load(std::string path)
{
std::ifstream ptr(path);
boost::archive::text_iarchive iarchive(ptr);
std::string string;
iarchive >> string;
return string;
}
int main(int argc, char * argv[])
{
// 文本格式序列化与反序列化
std::string save = "hello lyshark \n";
txt_save("c://txt_save.txt",save);
std::string text_load = txt_load("c://txt_save.txt");
std::cout << "输出字符串: " << text_load << std::endl;
system("pause");
return 0;
}
4.2 针对数组的序列化
针对数组的序列化是一种将数组数据结构进行持久化和传输的序列化技术,它可以将数组中的数据转化为二进制流,使得其可以被传输和存储。在实际开发中,我们经常需要进行数组的序列化操作,以便在需要时可以恢复出该数组的数据。Boost库中提供了一组非常方便的序列化工具,可以轻松地将数组从内存中打包创建成字符串,反序列化则是反之。
在本节中,我们将重点介绍Boost库中针对数组的序列化相关概念和用法,包括如何使用Boost.Serialization进行数组序列化和反序列化操作、如何定义自定义数组序列化函数、如何处理多维数组以及如何进行特定数据类型的序列化等。通过本节的学习,读者可掌握Boost库中针对数组的序列化技术的实际应用,提高C++程序开发能力。
#include <iostream>
#include <fstream>
#include <vector>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>
void array_save(std::string path,int *my_array,int count)
{
std::ofstream ptr(path);
boost::archive::text_oarchive archive(ptr);
std::vector<int> vect(my_array, my_array + count);
archive & BOOST_SERIALIZATION_NVP(vect);
}
void array_load(std::string path)
{
std::ifstream ptr(path);
boost::archive::text_iarchive iarchive(ptr);
std::vector<int> vect;
iarchive >> BOOST_SERIALIZATION_NVP(vect);
std::ostream_iterator<int> object(std::cout, " ");
std::copy(vect.begin(), vect.end(), object);
}
int main(int argc, char * argv[])
{
int my_array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
array_save("c://array_save.txt", my_array, 10);
array_load("c://array_save.txt");
system("pause");
return 0;
}
4.3 针对结构体的序列化
针对结构体的序列化是一种将结构体数据类型进行持久化和传输的序列化技术,它可以将结构体中的数据转化为二进制流,使得其可以被传输和存储。在实际开发中,我们经常需要进行结构体的序列化操作,以便在需要时可以恢复出该结构体的数据。Boost库中提供了一组非常方便的序列化工具,可以轻松地将结构体从内存中打包创建成字符串,反序列化则是反之。
在本节中,我们将重点介绍Boost库中针对结构体的序列化相关概念和用法,包括如何使用Boost.Serialization进行结构体序列化和反序列化操作、如何定义自定义结构体序列化函数、如何处理结构体中的指针等。通过本节的学习,读者可掌握Boost库中针对结构体的序列化技术的实际应用,提高C++程序开发能力。
#include <iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
typedef struct MyDate
{
unsigned int m_day;
unsigned int m_month;
unsigned int m_year;
MyDate(int d, int m, int y)
{
m_day = d;
m_month = m;
m_year = y;
}
MyDate()
{
m_day = 0;
m_month = 0;
m_year = 0;
}
template<typename Archive>
void serialize(Archive& archive, const unsigned int version)
{
archive & BOOST_SERIALIZATION_NVP(m_day);
archive & BOOST_SERIALIZATION_NVP(m_month);
archive & BOOST_SERIALIZATION_NVP(m_year);
}
}MyDate;
void struct_save(std::string path,MyDate *ptr)
{
std::ofstream file(path);
boost::archive::text_oarchive oa(file);
// MyDate d(15, 8, 1947);
oa & BOOST_SERIALIZATION_NVP(*ptr);
}
MyDate struct_load(std::string path)
{
MyDate ref;
std::ifstream file(path);
boost::archive::text_iarchive ia(file);
ia >> BOOST_SERIALIZATION_NVP(ref);
return ref;
}
int main(int argc, char * argv[])
{
// 序列化
MyDate save_data(12, 7, 1997);
struct_save("c://archive.txt", &save_data);
// 反序列化
MyDate load_data;
load_data = struct_load("c://archive.txt");
std::cout << "反序列化: " << load_data.m_day << std::endl;
system("pause");
return 0;
}
4.4 嵌套结构体的序列化
嵌套结构体的序列化是一种将复杂数据类型进行持久化和传输的序列化技术,它不仅可以序列化单一的结构体,还可以将多个结构体嵌套在一起进行序列化。在实际开发中,我们经常需要进行嵌套结构体的序列化操作,以便在需要时可以恢复出该结构体的数据。
在本节中,我们将重点介绍Boost库中针对嵌套结构体的序列化相关概念和用法,包括如何使用Boost.Serialization进行嵌套结构体序列化和反序列化操作、如何定义自定义嵌套结构体序列化函数、如何处理结构体中的指针等。通过本节的学习,读者可掌握Boost库中针对嵌套结构体的序列化技术的实际应用,提高C++程序开发能力。
#include <iostream>
#include <fstream>
#include <vector>
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
using namespace std;
struct User
{
string name;
string email;
int age;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned version)
{
ar & name & email & age;
}
};
struct Group
{
string gid;
User leader;
vector<User> members;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned version)
{
ar & gid & leader & members;
}
};
ostream& operator<<(ostream& os, const User& user)
{
return os << user.name << ", " << user.email << ", " << user.age << endl;
}
int main(int argc, char * argv[])
{
User user1 = { "admin", "admin@email.com", 40 };
User user2 = { "guest", "guest@email.com", 30 };
User user3 = { "lyshark", "lyshark@email.com", 42 };
User user4 = { "root", "root@email.com", 37 };
Group group;
group.gid = "10001";
group.leader = user1;
group.members.push_back(user2);
group.members.push_back(user3);
group.members.push_back(user4);
// 序列化到文件
ofstream fout("c://save.txt");
boost::archive::text_oarchive oa(fout);
oa << group;
fout.close();
// 反序列化
Group group_load;
ifstream fin("c://save.txt");
boost::archive::text_iarchive ia(fin);
ia >> group_load;
cout << group_load.leader;
copy(group_load.members.begin(), group_load.members.end(), ostream_iterator<User>(cout));
system("pause");
return 0;
}
4.5 针对类的序列化
针对类的序列化是一种将类数据类型进行持久化和传输的序列化技术,它可以将类中的数据转化为二进制流,使得其可以被传输和存储。
在实际开发中,我们经常需要进行类的序列化操作,以便在需要时可以恢复出该类的数据。Boost库中提供了一组非常方便的序列化工具,可以轻松地将类从内存中打包创建成字符串,反序列化则是反之。
#include <iostream>
#include <fstream>
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
using namespace std;
class User
{
public:
User()
{
name = "";
email = "";
age = 0;
}
User(const string& _name, const string& _email, const int & _age)
{
name = _name;
email = _email;
age = _age;
}
string getName() const
{
return name;
}
string getEmail() const
{
return email;
}
int getAge() const
{
return age;
}
private:
string name;
string email;
int age;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &archive, const unsigned version)
{
archive & name & email & age;
}
};
int main(int argc, char * argv[])
{
User ptr[3] =
{
User("admin", "admin@lyshark.com", 22),
User("guest", "guest@lyshark.com", 24),
User("lyshark", "lyshark@lyshark.com", 44)
};
// 序列化到文件
ofstream file("c://save.txt");
boost::archive::text_oarchive oa(file);
oa << ptr;
file.close();
// 反序列化加载到类中
User buf[3];
ifstream file_in("c://save.txt");
boost::archive::text_iarchive ia(file_in);
ia >> buf;
cout << "姓名1: "<< buf[0].getName() << "," << "姓名2: " << buf[1].getName() << endl;
system("pause");
return 0;
}
4.6 序列化文本到字符串
将序列化文本转换成字符串是序列化和反序列化过程中的一项常见需求,可以用于网络传输、文件存储等场景。Boost库中提供了一组非常方便的序列化工具,可以将序列化文本打包成字符串,反序列化则是反之。
在本节中,我们将重点介绍如何将序列化文本转换为字符串,包括如何将二进制流进行编码、如何进行限长编码以及如何使用Boost.Serialization中的相关类进行编码操作等。此外,还会介绍如何进行序列化和反序列化过程中的错误处理。通过本节的学习,读者可掌握Boost库中序列化文本到字符串的技术实现,提高C++程序开发能力。
#include <iostream>
#include <sstream>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
std::string binary_save(std::string save_string)
{
std::ostringstream os;
boost::archive::binary_oarchive archive(os);
archive << save_string;
std::string content = os.str();
return content;
}
std::string binary_load(std::string load_string)
{
std::istringstream is(load_string);
boost::archive::binary_iarchive archive(is);
std::string item;
archive >> item;
return item;
}
int main(int argc, char * argv[])
{
// 将字符串序列化,并存入get变量
std::string get = binary_save(std::string("hello lyshark"));
std::cout << "序列化后: " << get << std::endl;
std::string load = binary_load(get);
std::cout << "反序列化: " << load << std::endl;
system("pause");
return 0;
}
4.7 序列化数组到字符串
将序列化的数组数据转换成字符串是序列化和反序列化过程中的一项常见需求,可以用于网络传输、文件存储等场景。Boost库中提供了一组非常方便的序列化工具,可以将序列化的数组数据打包成字符串,反序列化则是反之。
在本节中,我们将重点介绍如何将序列化的数组转换为字符串,包括如何将二进制流进行编码、如何进行限长编码以及如何使用Boost.Serialization中的相关类进行编码操作等。此外,还会介绍如何进行序列化和反序列化过程中的错误处理。通过本节的学习,读者可掌握Boost库中序列化数组到字符串的技术实现,提高C++程序开发能力。
#include <iostream>
#include <sstream>
#include <vector>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/vector.hpp>
std::string array_save(int *my_array, int count)
{
std::ostringstream os;
boost::archive::binary_oarchive archive(os);
std::vector<int> vect(my_array, my_array + count);
archive & BOOST_SERIALIZATION_NVP(vect);
std::string content = os.str();
return content;
}
std::vector<int> array_load(std::string load_string)
{
std::istringstream is(load_string);
boost::archive::binary_iarchive archive(is);
std::vector<int> vect;
archive >> BOOST_SERIALIZATION_NVP(vect);
return vect;
}
int main(int argc, char * argv[])
{
int my_array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
std::string str = array_save(my_array, 10);
std::cout << "序列化后: " << str << std::endl;
std::vector<int> vect = array_load(str);
for (int x = 0; x < 10; x++)
{
std::cout << "反序列化输出: " << vect[x] << std::endl;
}
system("pause");
return 0;
}
4.8 序列化结构体到字符串
将序列化的结构体数据转换成字符串是序列化和反序列化过程中的一项常见需求,可以用于网络传输、文件存储等场景。Boost库中提供了一组非常方便的序列化工具,可以将序列化的结构体数据打包成字符串,反序列化则是反之。在本节中,我们将重点介绍如何将序列化的结构体数据转换为字符串,包括如何将二进制流进行编码、如何进行限长编码、基于文本的序列化操作以及如何使用Boost.Serialization中的相关类进行编码操作等。
此外,还会介绍如何进行序列化和反序列化过程中的错误处理。通过本节的学习,读者可掌握Boost库中序列化结构体到字符串的技术实现,提高C++程序开发能力。
#include <iostream>
#include <sstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
typedef struct MyDate
{
unsigned int m_day;
unsigned int m_month;
unsigned int m_year;
MyDate(int d, int m, int y)
{
m_day = d;
m_month = m;
m_year = y;
}
MyDate()
{
m_day = 0;
m_month = 0;
m_year = 0;
}
template<typename Archive>
void serialize(Archive& archive, const unsigned int version)
{
archive & BOOST_SERIALIZATION_NVP(m_day);
archive & BOOST_SERIALIZATION_NVP(m_month);
archive & BOOST_SERIALIZATION_NVP(m_year);
}
}MyDate;
std::string struct_save(MyDate *ptr)
{
std::ostringstream os;
boost::archive::binary_oarchive archive(os);
archive & BOOST_SERIALIZATION_NVP(*ptr);
std::string content = os.str();
return content;
}
MyDate struct_load(std::string load_string)
{
MyDate item;
std::istringstream is(load_string);
boost::archive::binary_iarchive archive(is);
archive >> item;
return item;
}
int main(int argc, char * argv[])
{
// 序列化
MyDate save_data(12, 7, 1997);
std::string save_string = struct_save(&save_data);
std::cout << "序列化后: " << save_string << std::endl;
// 反序列化
MyDate ptr;
ptr = struct_load(save_string);
std::cout << "反序列化: " << ptr.m_year << std::endl;
system("pause");
return 0;
}
4.9 序列化嵌套结构到字符串
将嵌套结构序列化数据转换成字符串是序列化和反序列化过程中的一项常见需求,可以用于网络传输、文件存储等场景。Boost库中提供了一组非常方便的序列化工具,可以将序列化的嵌套结构数据打包成字符串,反序列化则是反之。
在本节中,我们将重点介绍如何将序列化的嵌套结构数据转换为字符串,包括如何将二进制流进行编码、如何进行限长编码、基于文本的序列化操作以及如何使用Boost.Serialization中的相关类进行编码操作等。此外,还会介绍如何进行序列化和反序列化过程中的错误处理。通过本节的学习,读者可掌握Boost库中序列化嵌套结构到字符串的技术实现,提高C++程序开发能力。
#include <iostream>
#include <sstream>
#include <vector>
#include <boost/serialization/vector.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
using namespace std;
struct User
{
string name;
string email;
int age;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned version)
{
ar & name & email & age;
}
};
struct Group
{
string gid;
User leader;
vector<User> members;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned version)
{
ar & gid & leader & members;
}
};
// 序列化
std::string struct_save(Group *ptr)
{
std::ostringstream os;
boost::archive::binary_oarchive archive(os);
archive & BOOST_SERIALIZATION_NVP(*ptr);
std::string content = os.str();
return content;
}
// 反序列化
Group struct_load(std::string load_string)
{
Group item;
std::istringstream is(load_string);
boost::archive::binary_iarchive archive(is);
archive >> item;
return item;
}
int main(int argc, char * argv[])
{
User user1 = { "admin", "admin@email.com", 40 };
User user2 = { "guest", "guest@email.com", 30 };
User user3 = { "lyshark", "lyshark@email.com", 42 };
User user4 = { "root", "root@email.com", 37 };
Group group;
group.gid = "10001";
group.leader = user1;
group.members.push_back(user2);
group.members.push_back(user3);
group.members.push_back(user4);
// 序列化
std::string save = struct_save(&group);
std::cout << "序列化后: " << save << std::endl;
// 反序列化
Group load;
load = struct_load(save);
std::cout << "UUID: " << load.gid << std::endl;
std::cout << "Uname: " << load.members[0].name << std::endl;
std::cout << "Uname2: " << load.members[1].name << std::endl;
system("pause");
return 0;
}
4.10 序列化类到字符串
在本节中,我们将重点介绍如何将序列化的类数据转换为字符串,包括如何将二进制流进行编码、如何进行限长编码、基于文本的序列化操作以及如何使用Boost.Serialization中的相关类进行编码操作等。此外,还会介绍如何进行序列化和反序列化过程中的错误处理。
#include <iostream>
#include <sstream>
#include <boost/serialization/vector.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
using namespace std;
class User
{
public:
User()
{
name = "";
email = "";
age = 0;
}
User(const string& _name, const string& _email, const int & _age)
{
name = _name;
email = _email;
age = _age;
}
string getName() const
{
return name;
}
string getEmail() const
{
return email;
}
int getAge() const
{
return age;
}
private:
string name;
string email;
int age;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &archive, const unsigned version)
{
archive & name & email & age;
}
};
int main(int argc, char * argv[])
{
User ptr[3] =
{
User("admin", "admin@lyshark.com", 22),
User("guest", "guest@lyshark.com", 24),
User("lyshark", "lyshark@lyshark.com", 44)
};
// 序列化数据
std::ostringstream os;
boost::archive::binary_oarchive archive_save(os);
archive_save & BOOST_SERIALIZATION_NVP(ptr);
std::string content = os.str();
std::cout << content << std::endl;
// 返序列化
User item[3];
std::istringstream is(content);
boost::archive::binary_iarchive archive_load(is);
archive_load >> item;
cout << "姓名1: " << item[0].getName() << "," << "姓名2: " << item[1].getName() << endl;
system("pause");
return 0;
}
4.11 序列化派生类到字符串
将序列化的派生类数据转换成字符串是序列化和反序列化过程中的一项常见需求,在本节中,我们将重点介绍如何将序列化的派生类数据转换为字符串,包括如何将二进制流进行编码、如何进行限长编码、基于文本的序列化操作以及如何使用Boost.Serialization中的相关类进行编码操作等。
#include <iostream>
#include <sstream>
#include <vector>
#include <boost/serialization/vector.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
using namespace std;
struct User
{
string name;
string email;
int age;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned version)
{
ar & name & email & age;
}
};
struct Group :public User
{
int level;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &archive, const unsigned version)
{
// 将父类序列化,不管父类有多少个成员
archive & boost::serialization::base_object<User>(*this);
archive & level;
}
};
// 序列化
std::string struct_save(Group *ptr)
{
std::ostringstream os;
boost::archive::binary_oarchive archive(os);
archive & BOOST_SERIALIZATION_NVP(*ptr);
std::string content = os.str();
return content;
}
// 反序列化
Group struct_load(std::string load_string)
{
Group item;
std::istringstream is(load_string);
boost::archive::binary_iarchive archive(is);
archive >> item;
return item;
}
int main(int argc, char * argv[])
{
Group group_ptr;
group_ptr.name = "lyshark";
group_ptr.age = 24;
group_ptr.email = "me@lyshark.com";
group_ptr.level = 1024;
// 序列化到字符串
std::string save = struct_save(&group_ptr);
std::cout << "序列化后: " << save << std::endl;
// 反序列化到字符串
Group load;
load = struct_load(save);
std::cout << "名字: " << load.name << "序号: " << load.level << std::endl;
system("pause");
return 0;
}
本文作者: 王瑞
本文链接: https://www.lyshark.com/post/b0a10d1.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
4.4 C++ Boost 数据集序列化库的更多相关文章
- cereal:C++实现的开源序列化库
闲来无事发现了一个基于C++实现的序列化工具,相比于其他(比如Boost serialization或Google protobuf,恰巧都用过,以后再介绍),使用简单,感觉不错,下面做个摸索. ce ...
- C++序列化库的实现
C++中经常需要用到序列化与反序列化功能,由于C++标准中没有提供此功能,于是就出现了各式各样的序列化库,如boost中的,如谷歌的开源项目,但是很多库都依赖其他库过于严重,导致库变得很庞大.今天来分 ...
- 测试了下boost的序列化反序列化功能
// testSerialization.cpp : Defines the entry point for the console application. // #include "st ...
- boost之date_time库
最近开了boost库的学习,就先从日期时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的.以下算是我学习的笔记,我把它记录下来,以后便于我复习和查阅. #inclu ...
- 除了cPickle,cjson外还有没有更高效点的序列化库了
除了cPickle,cjson外还有没有更高效点的序列化库了 http://blog.csdn.net/chen_lovelotus/article/details/7228745 msgpack最快 ...
- Boost的某些库还是需要生成二进制的库的,必须安装才行,以及使用库的方法
头文件就是库使用者最常问的问题就是“我该怎么安装Boost”,这个也是我一开始最关心的问题,Boost这点做的很好,将大部分实现都封装在头文件里,所以对于一些基本的Boost库,其实是不需要安装的,只 ...
- #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...
- 性能超四倍的高性能.NET二进制序列化库
二进制序列化在.NET中有很多使用场景,如我们使用分布式缓存时,通常将缓存对象序列化为二进制数据进行缓存,在ASP.NET中,很多中间件(如认证等)也都是用了二进制序列化. 在.NET中我们通常使用S ...
- Microsoft开源跨平台的序列化库——Bond
上个月Microsoft开源了Bond,一个跨平台的模式化数据处理框架.Bond支持跨语言的序列化/反序列化,支持强大的泛型机制能够对数据进行有效地处理.该框架在Microsoft公司内部的高扩展服务 ...
- 初探boost之timer库学习笔记
timer 使用方法 #include <boost/timer.hpp> #include <iostream> using namespace std; usi ...
随机推荐
- 2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子。 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 如果剩余橘子数 n 能被
2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. 如果剩余橘子数 n 能被 ...
- cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本。
错误信息: cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本.有关详细信息,请参阅 https:/go.microsoft.com ...
- 我写了本开源书:《3D编程模式》
大家好,我写了本开源书,罗列了我从自己的实战项目中提炼出来的关于3D编程(主要包括"3D引擎/游戏引擎"."编辑器"开发)的各种编程模式 本书的在线阅读地址在这 ...
- GPT虚拟直播Demo系列(二)|无人直播间实现虚拟人回复粉丝
摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新.在直播间场景里,虚拟人和数字人可用于直播主播.智能客服.营销推广等.接入GPT的虚拟人像是加了超强b ...
- 【python基础】基本数据类型-数字类型
Python3 支持int(整型数据).float(浮点型数据).bool(布尔类型) 1.int(整型数据) 在Python 3里,只有一种整数类型 int,表示为长整型.像大多数语言一样,数值类型 ...
- Galaxy生物信息分析平台的数据集对象清理
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. Galaxy Project 是在云计算背景下诞生的一个生物信息学可视化分析开源项目.该项目由 ...
- [Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args
0 序言 一次没搞懂,处处受影响.这个问题属于基础问题,但又经常踩坑,不得不重视一下了. 1 Java程序动态参数的配置途径:系统变量与JVM参数(VM Option) vs 环境变量 vs 启动程序 ...
- Rust的类型系统
Rust的类型系统 类型于20世纪50年代被FORTRAN语言引入,其相关的理论和应用已经发展得非常成熟.现在,类型系统已经成为了各大编程语言的核心基础. 通用基础 所谓类型,就是对表示信息的值进行的 ...
- 如何通过数据warehouse更好地支持企业数字化转型战略
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 <如何通过数据 warehouse 更好地支持企业数字化转型战略> 随着企业数 ...
- 详解Django请求与响应:深入理解Web Http交互的核心机制
本文深入探讨了 Django 中的请求与响应处理,从 Django 请求和响应的基础知识.生命周期,到 HttpRequest 和 HttpResponse 对象的详细介绍.同时,讨论了 Django ...