精华内容
下载资源
问答
  • C++中的push_back函数

    万次阅读 2018-08-08 08:41:23
    如c++中的vector头文件里面就有这个push_back函数,在vector类中作用为在vector尾部加入一个数据。 string中也有这个函数,作用是字符串之后插入一个字符。 //basic_string_push_back.cpp //compilewith:/EHsc #...

    push_back是算法语言里面的一个函数名。如c++中的vector头文件里面就有这个push_back函数,在vector类中作用为在vector尾部加入一个数据。

    string中也有这个函数,作用是字符串之后插入一个字符。

    //basic_string_push_back.cpp
    //compilewith:/EHsc
    #include <string>
    #include <iostream>
    int main()
    {
    using namespace std;
    string str1("abc");
    basic_string<char>::iterator str_Iter,str1_Iter;
    cout<<"The original string str1 is:";
    for(str_Iter=str1.begin();str_Iter!=str1.end();str_Iter++)
    cout<<*str_Iter;
    cout<<endl;
    str1.push_back('d');
    cout<<"The modified string str1 is:";
    for(str_Iter=str1.begin();str_Iter!=str1.end();str_Iter++)
    cout<<*str_Iter;
    cout<<endl;
    }

    输出:

    1

     

    2

    The original string str1 is:abc

     

    The modified string str1 is:abcd

    展开全文
  • C++的string类中,要想在字符串后附加字符,可以使用append函数、push_back函数或者是+=运算符,这些附加字符的方法其实现不尽相同,因此应用场景也不同。 首先我们先一窥源码(gcc 4.9.2): basic_string.h: //-...

    部分内容翻译自 https://www.geeksforgeeks.org/stdstringappend-vs-stdstringpush_back-vs-operator-c/?ref=lbp

    引言

    C++的string类中,要想在字符串后附加字符,可以使用append函数、push_back函数或者是+=运算符,这些附加字符的方法其实现不尽相同,因此应用场景也不同。
    首先我们先一窥源码(gcc 4.9.2):

    basic_string.h:

     //-------------------------------+=运算符重载部分---------------------------
    //追加 string 类型字符串
     basic_string&
     operator+=(const basic_string& __str)		
     { return this->append(__str); }
    
    //追加 cstring 类型字符串
     basic_string&
     operator+=(const _CharT* __s)				
     { return this->append(__s); }
    
    //追加单个字符
     basic_string&
     operator+=(_CharT __c)						
     { 
    	this->push_back(__c);
    	return *this;
     }
    
    #if __cplusplus >= 201103L
        
    //追加字符类型的初始化列表
     basic_string&
     operator+=(initializer_list<_CharT> __l)		
     { return this->append(__l.begin(), __l.size()); }
     
    //-------------------------------append函数实现部分---------------------------
    
    //追加 string 类型字符串
     basic_string&
     append(const basic_string& __str);			
    
    //追加部分 string 类型字符串
     basic_string&								
     append(const basic_string& __str, size_type __pos, size_type __n);
    
    //追加部分 cstring 类型字符串
     basic_string&								
     append(const _CharT* __s, size_type __n);
    
    //追加 cstring 类型字符串
     basic_string&								
     append(const _CharT* __s)
     {
    	__glibcxx_requires_string(__s);
    	return this->append(__s, traits_type::length(__s));
     }
    
    //追加多个字符
     basic_string&							
     append(size_type __n, _CharT __c);
    
    #if __cplusplus >= 201103L
    
    //追加字符类型的初始化列表
     basic_string&							
     append(initializer_list<_CharT> __l)
     { return this->append(__l.begin(), __l.size()); }
     
    #endif // C++11
    
     template<class _InputIterator>
     basic_string&							//附加给定范围内的多个字符
     append(_InputIterator __first, _InputIterator __last)
     { return this->replace(_M_iend(), _M_iend(), __first, __last); }
     
     //-------------------------------push_back函数实现部分---------------------------
     
      //追加单个字符
      void
      push_back(_CharT __c)			
      { 
    	const size_type __len = 1 + this->size();
    	if (__len > this->capacity() || _M_rep()->_M_is_shared())
    		this->reserve(__len);
    	traits_type::assign(_M_data()[this->size()], __c);
    	_M_rep()->_M_set_length_and_sharable(__len);
      }
    
    

    从以上源码的角度来分析append函数、push_back函数和+=运算符的不同使用场景,就非常直观了:

    • += 运算符:追加单个参数值。
    • append 函数:允许追加多个参数值。
    • push_back 函数:只能追加单个字符。
    append() += push_back
    全字符串(string) ×
    部分字符串(substring) × ×
    字符数组(char array) ×
    单个字符(char) ×
    迭代器范围(iterator range) × ×
    返回值(return value) *this *this none
    cstring(char*) ×

    示例

    1 全字符串(string)

    • += 运算符:可以追加完整字符串。
    • append 函数:也允许追加完整字符串
    • push_back 函数:不允许追加完整字符串。
    // CPP code for comparison on the 
    // basis of appending Full String 
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    // Function to demonstrate comparison among 
    // +=, append(), push_back() 
    void appendDemo(string str1, string str2) 
    { 
    	string str = str1; 
    
    	// Appending using += 
    	str1 += str2; 
    	cout << "Using += : "; 
    	cout << str1 << endl; 
    
    	// Appending using append() 
    	str.append(str2); 
    	cout << "Using append() : "; 
    	cout << str << endl; 
    } 
    
    // Driver code 
    int main() 
    { 
    	string str1("Hello World! "); 
    	string str2("GeeksforGeeks"); 
    
    	cout << "Original String : " << str1 << endl; 
    	appendDemo(str1, str2); 
    
    	return 0; 
    } 
    
    
    

    2 追加部分字符串(substring)

    • += 运算符:不允许追加部分字符串。
    • append 函数:该函数允许追加部分字符串。
    • push_back 函数:不支持追加部分字符串。
    // CPP code for comparison on the basis of 
    // Appending part of string 
    
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    // Function to demonstrate comparison among 
    // +=, append(), push_back() 
    void appendDemo(string str1, string str2) 
    { 
    	// Appends 5 characters from 0th index of 
    	// str2 to str1 
    	str1.append(str2, 0, 5); 
    	cout << "Using append() : "; 
    	cout << str1; 
    } 
    
    // Driver code 
    int main() 
    { 
    	string str1("GeeksforGeeks "); 
    	string str2("Hello World! "); 
    
    	cout << "Original String : " << str1 << endl; 
    	appendDemo(str1, str2); 
    
    	return 0; 
    } 
    
    
    

    3 追加 C-string(char*)

    • += 运算符:允许追加 C-string。
    • append 函数:同样允许追加 C-string。
    • push_back 函数:不允许使用 push_back 函数追加 C-string。
    // CPP code for comparison on the basis of 
    // Appending C-string 
    
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    // Function to demonstrate comparison among 
    // +=, append(), push_back() 
    void appendDemo(string str) 
    { 
    	string str1 = str; 
    
    	// Appending using += 
    	str += "GeeksforGeeks"; 
    	cout << "Using += : "; 
    	cout << str << endl; 
    
    	// Appending using append() 
    	str1.append("GeeksforGeeks"); 
    	cout << "Using append() : "; 
    	cout << str1 << endl; 
    } 
    
    // Driver code 
    int main() 
    { 
    	string str("World of "); 
    
    	cout << "Original String : " << str << endl; 
    	appendDemo(str); 
    
    	return 0; 
    } 
    
    
    

    4 追加字符数组(char array)

    • += 运算符:允许追加字符数组。
    • append 函数:同样允许追加字符数组。
    • push_back 函数:不支持追加字符数组。
    // CPP code for comparison on the basis of 
    // Appending character array 
    
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    // Function to demonstrate comparison among 
    // +=, append(), push_back() 
    void appendDemo(string str) 
    { 
    	char ch[6] = {'G', 'e', 'e', 'k', 's', '\0'}; 
    	string str1 = str; 
    
    	// Appending using += 
    	str += ch; 
    	cout << "Using += : " << str << endl; 
    
    	// Appending using append() 
    	str1.append(ch); 
    	cout << "Using append() : "; 
    	cout << str1 << endl; 
    } 
    
    // Driver code 
    int main() 
    { 
    	string str("World of "); 
    
    	cout << "Original String : " << str << endl; 
    	appendDemo(str); 
    
    	return 0; 
    } 
    
    
    

    5 追加单个字符(char)

    • += 运算符:允许使用 += 运算符追加单个字符。
    • append 函数:不允许追加单个字符。
    • push_back 函数:支持追加单个字符。
    // CPP code for comparison on the basis of 
    // Appending single character 
    
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    // Function to demonstrate comparison among 
    // +=, append(), push_back() 
    void appendDemo(string str) 
    { 
    	string str1 = str; 
    
    	// Appending using += 
    	str += 'C'; cout << "Using += : " << str << endl; 
    
    	// Appending using push_back() 
    	str1.push_back('C'); 
    	cout << "Using push_back : "; 
    	cout << str1; 
    } 
    
    // Driver code 
    int main() 
    { 
    	string str("AB"); 
    
    	cout << "Original String : " << str << endl; 
    	appendDemo(str); 
    
    	return 0; 
    } 
    
    
    

    6 迭代器范围(iterator range)

    • += 运算符:不支持迭代器范围。
    • append 函数:支持迭代器范围。
    • push_back 函数:不支持迭代器范围。
    // CPP code for comparison on the basis of 
    // Appending using iterator range 
    
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    // Function to demonstrate comparison among 
    // +=, append(), push_back() 
    void appendDemo(string str1, string str2) 
    { 
    
    	// Appends all characters from 
    	// str2.begin()+5, str2.end() to str1 
    	str1.append(str2.begin() + 5, str2.end()); 
    	cout << "Using append : "; 
    	cout << str1; 
    } 
    // Driver code 
    int main() 
    { 
    	string str1("Hello World! "); 
    	string str2("GeeksforGeeks"); 
    
    	cout << "Original String : " << str1 << endl; 
    	appendDemo(str1, str2); 
    
    	return 0; 
    } 
    
    
    

    7 返回值(return value)

    • += 运算符:返回 *this
    • append 函数:返回 *this
    • push_back 函数:不返回值
    // CPP code for comparison on the basis of 
    // Return value 
    
    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    // Function to demonstrate comparison among 
    // +=, append(), push_back() 
    string appendDemo(string str1, string str2) 
    { 
    	// Appends str2 in str1 
    	str1.append(str2); // Similarly with str1 += str2 
    	cout << "Using append : "; 
    
    	// Returns *this 
    	return str1; 
    } 
    
    // Driver code 
    int main() 
    { 
    	string str1("Hello World! "); 
    	string str2("GeeksforGeeks"); 
    	string str; 
    	cout << "Original String : " << str1 << endl; 
    	str = appendDemo(str1, str2); 
    	cout << str; 
    	return 0; 
    } 
    
    
    
    展开全文
  • string s; for(int i=0;i<3;i++){ // char buf[1]; // itoa(i,buf,2); // cout<<buf[0]<<endl; s.push_back('1'); cout<<s[0]<<endl; }

    在下面的代码里,循环体里面的注释块和代码块函数只有一个可以运行,同时运行时会报错。

    	string s;
    	for(int i=0;i<3;i++){
    //		char buf[1];
    //		itoa(i,buf,2);
    //		cout<<buf[0]<<endl;
    		s.push_back('1');
    		cout<<s[0]<<endl;
    	}
    

    错误如下:
    terminate called after throwing an instance of ‘std::length_error’
    what(): basic_string::_S_create;
    我理解是在s.pushback()函数里出现了错误,但是不理解这个错误和前面的代码块有什么关系,运行时错误里面有S_create, 我理解是因为s.push_back()成员函数会调用字符串的reserve()函数来重置string的堆空间,将string的空间+1存入新的字符,但是我不理解这一步创建和前面的代码块有什么关系,为什么加上这一块运行时报错,而不加就没有错误?

    尝试了几次发现itoa()函数和push_back()函数有冲突,但是库里面没有关于itoa()函数的相关实现,也无法进一步了解这两个函数到底有什么冲突。

    在这里记录一下。

    展开全文
  • MFC push_back函数使用

    2018-05-15 12:57:21
    [img=https://img-bbs.csdn.net/upload/201805/15/1526360047_264220.png][/img][img=https://img-bbs.csdn.net/upload/201805/15/1526360095_354429.png][/img][img=...
  • push_back 就是在vector的末尾插入一个元素, vector 中的erase()函数,从指定容器删除指定位置的元素或者某段范围内的元素,删除之后,返回值也是一个迭代器,指向最后一个删除元素的下一个元素, 出现的问题...

    push_back   就是在vector的末尾插入一个元素,

     

     

    vector 中的erase()函数,从指定容器删除指定位置的元素或者某段范围内的元素,删除之后,返回值也是一个迭代器,指向最后一个删除元素的下一个元素,

    出现的问题就是:迭代器变成了一个野指针,需要重新把迭代器的指针指向begin或者把返回的迭代器赋值给原来的迭代器,否则会报编译错误

     

    iter = vetcor.erase(iter);

     

    or:

    vectore.erase(iter);

    iter=v1.begin;

     

    转载于:https://www.cnblogs.com/wust221/p/5414820.html

    展开全文
  • 刚开始学c++,用的书是《c++ primer》的第五版,题目如下: !... 代码如下: ...感觉是因为输入结束之后一直跳不出push_back的while循环, 书上和网上的例子都是这样,但我的就不行,迷惑????
  • 研究STL之vector的push_back函数解析

    千次阅读 2012-06-08 22:00:39
    突然对vector的push_back好奇,于是看了一下vector的源码,做了以下总结。技术水平不行,写作水平更不行,没空画图。大家看看指出错误。  1、如果有足够空闲的申请的空间,直接插入到最后,调用了通用的一个函数...
  • vector::push_back函数解析

    千次阅读 2014-06-16 20:54:35
    上一篇文章中,关于stl_vector的故事只是个开始. 这篇文章中,接着去分析vector中的... 后面陆续的几篇文章都会详细分析vector中的函数实现. 我尽量做到篇幅不大,而且能够尽量用自己的语言和自己分析的结果给大  
  • c++11 之emplace_back 与 push_back的区别

    万次阅读 多人点赞 2018-12-03 14:32:45
    在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。...
  • 通过代码以及运行效果可以看出,push_back的实质是拷贝一个变量的值,存入vector容器中,变量值的改变并不会导致容器中的值改变. 最后我打印了两者的地址,可以看出两者的地址确实不一样,并且vector容器逻辑上相邻的...
  • p->length.push_back(number); } for(i = 0;i < p->length.size();i++) cout << p->length[i] ; return 0; } 用结构体p1是对的,但是用结构体指针就不对了,不知道为什么?求大神指导啊!
  • C++ vector 转化成数组,push_back函数怎样转化,加断点监测变量值发现不一样。 第一个是C++代码,用到了verctor容器: double SJN_MultiCueBGS::CalculateHausdorffDist(IplImage* input_image, IplImage* ...
  • 在vs2008下,当在一个结构体中有vector类型的成员时,如果在定义了一个该结构体的变量,并使用memset函数对其初始化,在debug版本下并不会有问题。但换成release版本后,程序运行会产生异常,并报如下信息: ...
  • 在vs2008下,当在一个结构体中有vector类型的成员时,如果在定义了一个该结构体的变量,并使用memset函数对其初始化,在debug版本下并不会有问题。但换成release版本后,程序运行会产生异常,并报如下信息: ...
  • 双端队列(deque)和向量没有多少区别。它们主要的区别在性能上:和向量相比,在双端...下面为push_back和push_front函数的列子: 1 #include <iostream> 2 #include <cassert> 3 #include <stri...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,203
精华内容 881
关键字:

push_back函数