getline函数_C++常用小函数

项目中经常用到一些小函数(windows,ubuntu及安卓下通过测试)

目录:

1. std::string常用操作

  • std::string 转 double
  • double 转 std::string
  • std::string 转 int
  • int 转 std::string
  • std::string 转大写
  • 一个字符串是否包含另外一个字符串
  • 字符串替换replace
  • 字符串分割split
  • 字符串去除空格trim

2. 文件IO操作相关(路径操作及文件操作)

path

  • 给定文件是否存在
  • 获得文件夹下所有文件的名字列表
  • 获得文件夹下所有文件的路径列表
  • 给定路径是否是文件夹
  • 获得文件夹下的子文件夹列表
  • 获得文件名(不带扩展)

文件

  • 读取txt,按行读取
  • 读取txt,全部读取
  • 写入txt

3. STL操作

  • vector最大值、最小值
  • vector/map查找元素是否存在
  • vector是否包含重复元素
  • vector去除重复元素
  • std::sort对结构体数组排序
  • std::map/std::unordered_map使用
  • Member functions Vs Algorithm functions

1. std::string常用操作

  • std::string 转 double
  • double 转 std::string
  • std::string 转 int
  • int 转 std::string
  • std::string 转大写
  • 一个字符串是否包含另外一个字符串
  • 字符串替换replace
  • 字符串分割split
  • 字符串去除空格trim
std::string Double2String(double myDoubleVar) {

		// The C++11 way:
		//return std::to_string(myDoubleVar);

		/*
		//The C way:
		char buffer[32];
		snprintf(buffer, sizeof(buffer), "%g", myDoubleVar);
		*/
		//The C++03 way:
		std::ostringstream sstream;
		sstream << myDoubleVar;
		return sstream.str();

	}

	std::string Double2String(double dbl, int num) {
		std::ostringstream sstream;
		sstream << std::setiosflags(std::ios::fixed) << std::setprecision(num) << dbl;
		return sstream.str();
	}

	double String2Double(std::string str) {
		//return std::stod(str);
		return  atof(str.c_str());
	}

	int String2int(std::string str) {
		//return std::stoi(str);
		return  atoi(str.c_str());
	}

	std::string Int2Stirng(int iNum) {
		/* c++ 11*/
		//return std::to_string(iNum);

		// method 2
		std::ostringstream ss;
		ss << iNum;
		return ss.str();

	}

	bool bStr1ContainsStr2(std::string str1, std::string str2) {
		return str1.find(str2) != std::string::npos;
	}

	std::string to_upper(std::string str) {
		std::transform(str.begin(), str.end(), str.begin(), ::toupper);
		return str;
	}

	std::string to_lower(std::string str) {
		std::transform(str.begin(), str.end(), str.begin(), ::tolower);
		return str;
	}

	std::string ReplaceAll(std::string str, const std::string& from, const std::string& to) {
		size_t start_pos = 0;
		while ((start_pos = str.find(from, start_pos)) != std::string::npos) {
			str.replace(start_pos, from.length(), to);
			start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
		}
		return str;
	}

字符串分割

std::vector<std::string> split(const std::string &s, char delim) {
    std::stringstream ss(s);
    std::string item;
    std::vector<std::string> elems;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
} 

2.文件操作相关(跨平台,没有使用windows only的)

  • 给定文件是否存在
  • 获得文件夹下所有文件的名字列表
  • 获得文件夹下所有文件的路径列表
  • 给定路径是否是文件夹
  • 获得文件夹下的子文件夹列表
  • 获得文件名(不带扩展)
  • 读取txt,按行读取
  • 读取txt,全部读取
  • 写入txt
  1. 方法1: 使用c++14/17
#include <sstream>
#include <fstream>
#include <experimental/filesystem>
namespace  fs = std::experimental::filesystem;

//https://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c
//判断文件是否存在
bool is_file_exist(const std::string& name) {
	//std::cout<<"is file exist"<<name<<std::endl;
	std::ifstream infile(name.c_str());
	return infile.good();

	//bool b=fs::exists(name);
	//return b;
}

/*http://www.martinbroadhurst.com/list-the-files-in-a-directory-in-c.html
* https://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
*/
//获得文件夹下的文件名列表
void GetFilesFromdirectory(const std::string& name, std::vector<std::string>& v)
{
	for (auto& p : fs::directory_iterator(name)) {
		v.push_back(p.path().filename().string());
	}
}

//获得文件夹下的文件路径列表
void GetFilesPathsFromdirectory(const std::string& name, std::vector<std::string>& v)
{
	for (auto& p : fs::directory_iterator(name)) {
		v.push_back(p.path().string());
	}
}

//是否是文件夹
bool is_folder(const char* dir_name) {
	return  fs::is_directory(dir_name);
}

//获得文件夹下的子文件夹列表
void GetSubDirectoryFromdirectory(const std::string& name, std::vector<std::string>& v)
{
	for (auto& p : fs::directory_iterator(name)) {
		if (fs::is_directory(p))		{
			v.push_back(p.path().filename().string());
		}
	}

}
//获得文件名不带扩展名
std::string GetFilenameWithoutExtension(const std::string& fileName) {
	std::size_t lastindex = fileName.find_last_of(".");
	return  fileName.substr(0, lastindex);
}

不使用c++14,使用“dirent.h”

/*http://www.martinbroadhurst.com/list-the-files-in-a-directory-in-c.html
* https://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
*/
void GetFilesFromdirectory(const std::string& name, std::vector<std::string>& v)
{
	DIR* dirp = opendir(name.c_str());
	if (dirp == nullptr)
	{
		std::cout << "INFO:" << name << "not exist" << std::endl;
		return;
	}
	struct dirent* dp;
	while ((dp = readdir(dirp)) != nullptr) {
		v.push_back(dp->d_name);
	}
	closedir(dirp);

}


bool is_folder(const char* dir_name) {
	auto dir = opendir(dir_name);
	if (dir) {
		closedir(dir);
		return true;
	}
	return false;
}

void GetSubDirectoryFromdirectory(const std::string& name, std::vector<std::string>& v)
{

	DIR* dirp = opendir(name.c_str());
	if (dirp == nullptr)
	{
		std::cout << "INFO:" << name << "not exist" << std::endl;
		return;
	}

	struct dirent* dp;
	while ((dp = readdir(dirp)) != nullptr) {
		if (dp->d_type & DT_DIR) {
			if (std::string(dp->d_name) != "." && std::string(dp->d_name) != "..") {
				v.push_back(dp->d_name);

			}
		}
	}
	closedir(dirp);
}

Txt I/O操作
标准库

#include <fstream>
ofstream         //文件写操作 内存写入存储设备 
ifstream         //文件读操作,存储设备读区到内存中
fstream          //读写操作,对打开的文件可进行读写操作

打开并建立文件的选项:

        ios::in            读权限
  	ios::out	   写权限
	ios::truce         清空写
	ios::app	   追加写,不清空			
	ios::ate	   和app相同(linux下)
	ios::binary	   二进制打开
#pragma once
#include <fstream>
#include <string>
#include <sstream>

class CTxtHelper {
public:
	static  void Write2Txt(std::string FileName,std::string strContant) {
	
		std::fstream f(FileName, std::ios::out);
		f << strContant << std::endl;
		f.close();

	}
	static  void Write2Txt(std::string FileName, std::vector<std::string> strAllines) {

		std::fstream f(FileName, std::ios::out);
		for (auto line : strAllines) {
			f << line << std::endl;
		}
		f.close();

	}

	static  std::string ReadFromTxt(std::string FileName) {
		std::ifstream t(FileName);
		std::stringstream buffer;
		buffer << t.rdbuf();
		std::string strJson(buffer.str());
		t.close();
		return  strJson;	
	}

	static bool ReadFromTxt(std::string FileName, std::vector<std::string> &Alllines) {

		Alllines.clear();
		std::ifstream file(FileName);
		if (file.is_open()) {
			std::string line;
			while (getline(file, line)) {
				Alllines.push_back(line);
			}
			file.close();
		}

	}


	//void CreatTanksFromTxt(CDynamicINFO* Outdata, std::string filePath) {
	//	int bay;
	//	double lcg, tcg, vcg;
	//	int num;
	//	double weight;
	//	double width;

	//	std::ifstream infile(filePath);
	//	while (infile >> bay >> lcg >> tcg >> vcg >> num >> weight >> width) {
	//		auto tank = std::make_shared<CContainerHoldTank>();
	//		tank->dblCurrentWeight = weight;
	//		tank->dblCurrentLCG = lcg;
	//		tank->dblCurrentTCG = tcg;
	//		tank->dblCurrentVCG = vcg;
	//		tank->dblDistriAftX = lcg - width / 2.0;
	//		tank->dblDistriForeX = lcg + width / 2.0;
	//		Outdata->listShipAllTank.push_back(tank);
	//	}

	//}


};

3. STL操作

  • vector最大值、最小值
double MAXOFVECTOR(const std::vector<double> &vec) {
		if (vec.size() == 0) return  0;
		return *std::max_element(vec.begin(), vec.end());
	}

	double MINOFVECTOR(const std::vector<double>& vec) {
		if (vec.size() == 0) return  0;
		return *std::min_element(vec.begin(), vec.end());
	}

	double MINOFVECTOR(const std::vector<double>& vec, int* index) {
		if(vec.size()>0) {
			auto biggest = std::min_element(vec.begin(), vec.end());
			*index = std::distance(std::begin(vec), biggest);
			return *biggest;
		}else {
			*index = 0;
			return 0;
		}
		
	}
	double MAXOFVECTOR(const std::vector<double>& vec, int* index) {
		if(vec.size()>0) {
			auto biggest = std::max_element(vec.begin(), vec.end());
			*index = std::distance(std::begin(vec), biggest);
			return *biggest;
		}else {
			*index = 0;
			return  0;
		}
	
	}
  • vector/map查找元素是否存在
	bool VectorContains(const std::vector<std::string>& v, std::string str) 
	{

		if (std::find(v.begin(), v.end(), str) != v.end())
		{
			return true;
		}
		return  false;
	}
  • vector是否包含重复元素

方法1:使用std::set

int removeDuplicates(vector<int>& nums) {
	set<int> num;
	for (int i = 0; i < nums.size(); i++) {
		num.insert(nums[i]);
	}
	nums.assign(num.begin(), num.end());
	return nums.size();
}

方法2:使用std::unique

int removeDuplicates2(vector<int>& nums) {
	std::sort(nums.begin(), nums.end());
	nums.erase(std::unique(begin(nums), end(nums)), nums.end());
	return nums.size();
}

方法3:烧脑壳

int removeDuplicates3(vector<int>& nums) {
	int len = 0, i = 0, j = 0;
	while (i < nums.size() && j < nums.size()) {
		nums[len++] = nums[i];
		while (j < nums.size() && nums[i] == nums[j]) j++;
		i = j;
	}
	return len;
}
  • vector去除重复元素

方法1:使用std::set

int removeDuplicates(vector<int>& nums) {
	set<int> num;
	for (int i = 0; i < nums.size(); i++) {
		num.insert(nums[i]);
	}
	nums.assign(num.begin(), num.end());
	return nums.size();
}

方法2:使用std::unique

int removeDuplicates2(vector<int>& nums) {
	std::sort(nums.begin(), nums.end());
	nums.erase(std::unique(begin(nums), end(nums)), nums.end());
	return nums.size();
}

方法3:烧脑壳

int removeDuplicates3(vector<int>& nums) {
	int len = 0, i = 0, j = 0;
	while (i < nums.size() && j < nums.size()) {
		nums[len++] = nums[i];
		while (j < nums.size() && nums[i] == nums[j]) j++;
		i = j;
	}
	return len;
}
  • std::sort对结构体数组排序

我经常使用std::sort对结构体配合Lammda匿名函数使用,比如点的数组按照x升序排列

class CPoint2D {
public:
	CPoint2D(double x1,double y1) {
		x = x1; y = y1;
	}
	double x;
	double y;
};
int main(){

	std::vector<CPoint2D> Pts{ {1,1},{3,3},{2,2} };
	std::sort(begin(Pts), end(Pts), [](const CPoint2D& pt1, const CPoint2D& pt2) {
		return  pt1.x < pt2.x;
		});
}
  • std::map/std::unordered_map使用

std::map底层为红黑树,std::unordered_map底层为哈希表,我喜欢用std::unordered_map,感觉查找速度快(我没做过测试)

#include <iostream>
#include <unordered_map>
int main() {
	//声明及初始化
	std::unordered_map<std::string, int> uMap0;
	std::unordered_map<std::string, int> uMap{ {"id1",1},{"id2",2} };
	//插入
	uMap.insert(std::make_pair("id3", 3));
	uMap.insert(std::make_pair("id4", 4));
	uMap.insert(std::pair < std::string, int>("id5", 5));
	uMap["id6"] = 6;

	//查找 find或count
	if (uMap.find("id3") != uMap.end()) {
		std::cout << "存在" << std::endl;
	}
	if (uMap.count("id2") == 1) {
		std::cout << "存在" << std::endl;
	}

	//遍历 for或while
	for (const auto& ele : uMap) {
		std::cout << ele.first << " " << ele.second << std::endl;
	}

	auto iter = uMap.begin();
	while (iter != uMap.end()) {
		std::cout << iter->first << " " << iter->second << std::endl;
		iter++;
	}

	//取值
	uMap["id1"] = 1;
	uMap.at("id2") = 2;

	//删除
	uMap.erase("id1");  //删除某元素
	uMap.clear();             //清空所有

	//判断字典是否为空empty/size
	if (uMap.empty()) {
		std::cout << "空" << std::endl;
	}
	if (uMap.size() == 0) {
		std::cout << "空" << std::endl;
	}
}
  • Member functions Vs Algorithm functions

Summary:

There are duplicated functions between container's member functions and algorithm functions, Prefer member functions over algorithm functions with the same time

{
std::unordered_set<int> s = { 1,2,3,5,4,8,9 };
auto iter = s.find(4); //O(1)
auto iter1 = std::find(s.begin(), s.end(), 4); //O(n)
}
//list
{
std::list<int> s = { 2,1,3,8,5,9 };
s.remove(3);
//s:{2,1,8,5,9}
auto iter1 = std::remove(s.begin(), s.end(), 3);
//s:{2,1,8,5,9,9}
s.erase(iter1, s.end());
//s:{}
}


待续...

参考:

  1. c++ code snippets
https://github.com/tommybennett/algorithm-mnemonics/blob/master/STLInstructionSet.md​github.com


2. c++ 读写文件操作

C++文件读写详解(ofstream,ifstream,fstream)_C/C++_晨雪无痕-CSDN博客​blog.csdn.net
b2a3ba8ca66c1e91feca8b19ea498971.png
linux入门:C++文件操作(读写)​zhuanlan.zhihu.com

3. co library

idealvin:C++ 基础库 CO 参考文档​zhuanlan.zhihu.com

4. c++ 17 <filesystem>

C++17 filesystem 文件系统(详解)​blog.csdn.net
b5e3853b4410e6c8e0018cde0c9e8e28.png
Filesystem library​en.cppreference.com

STL算法

Nonmodifying
ajf	adjacent_find
alo	all_of
ano	any_of
cni	count_if
cnt	count
eql	equal
ffo	find_first_of
fin	find_if_not
fnd	find
fne	find_end
fni	find_if
fre	for_each
ihp	is_heap
ihu	is_heap_until
ipr	is_permutation
ipt	is_partitioned
iss	is_sorted
isu	is_sorted_until
lxc	lexigraphical_compare
mme	minmax_element
mne	min_element
msm	mismatch
mxe	max_element
nno	none_of
ppt	partition_point
srh	search
srn	search_n

Sorting
mkh	make_heap
nth	nth_element
phh	push_heap
pph	pop_heap
psc	partial_sort_copy
pst	partial_sort
ptc	partition_copy
ptn	partition
spt	stable_partition
srt	sort
sth	sort_heap
sts	stable_sort

Sorted Ranges
bns	binary_search
eqr	equal_range
erl	equal_range
inc	includes
ipm	inplace_merge
lwb	lower_bound
mrg	merge
ssd	set_symmetric_difference
std	set_difference
stn	set_intersection
stu	set_union
ucp	unique_copy
upb	upper_bound

Modifying
cpb	copy_backward
cpi	copy_if
cpn	copy_n
cpy	copy
fil	fill
fln	fill_n
gnn	generate_n
gnr	generate
ita	iota
mov	move
mvb	move_backward
rci	replace_copy_if
rpc	replace_copy
rpi	replace_if
rpl	replace
swp	swap
swr	swap_ranges
tfm	transform

Removing
rmc	remove_copy
rmf	remove_copy_if
rmi	remove_if
rmv	remove
uqe	unique

Mutating
nxp	next_permutation
prp	prev_permutation
rtc	rotate_copy
rte	rotate
rvc	reverse_copy
rvr	reverse
shf	random_shuffle

Numeric
acl	accumulate
acm	accumulate

Idioms
erm	erase

Strings
ltr	string_trim_left
lwr	string_lower
trm	string_trim_right
upr	string_upper

Streams
oit	copy
sti	cin
sto	cout

Containers
stv	vector
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c++中的getline函数有两种形式。一种是istream类的成员函数,另一种是普通函数。在头文件<istream>中的getline函数是istream类的成员函数,它的原型为istream& getline (string& str, char delim); 这个成员函数可以从输入流中读取一行字符,并将结果存储在参数str指定的string对象中。其中,delim参数可选,用于指定行结束的分隔符。如果不指定分隔符,默认使用换行符作为分隔符。 另一种形式的getline函数在头文件<string>中定义,它的原型为istream& getline (istream& is, string& str, char delim); 这个函数与前一种形式类似,但是它的输入流作为参数is传递进来,而不是作为成员函数调用。读取的字符串同样会保存在参数str指定的string对象中,分隔符也是可选的。 对于istream类的getline函数,还有另外两种重载形式,它们的原型为: istream& getline (char* s, streamsize n); istream& getline (char* s, streamsize n, char delim); 这两种形式的区别在于,第一个形式将读取的字符存储在字符数组s中,数组的大小由参数n指定;而第二个形式还可以指定一个分隔符,用于确定行结束的位置。 总结起来,c++中的getline函数有两种形式,一种是istream类的成员函数,在<istream>头文件中定义;另一种是普通函数,在<string>头文件中定义。这两种形式都可以从输入流中读取一行字符,并将结果存储在string对象或字符数组中。同时,还可以指定一个分隔符来确定行结束的位置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++中的两种getline用法详解](https://download.csdn.net/download/weixin_38701725/12743235)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [c++ getline()详解](https://blog.csdn.net/m0_52824954/article/details/128194817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值