我只是编写一个小程序来将字符串中的字符传输到堆栈并打印出它的最高值。 它们只是简单的代码,但有不同的概念,我想问一下哪个代码更有效,为什么?
第一个代码
#include<string>
#include<iostream>
#include<stack>
using namespace std;
int main(){
string str ;
stack<char> s;
cin >> str ;
for(int i=0;i<str.size();i++){
cout << str[i] << "\n";
s.push(str[i]);
cout << "Top of the stack " << s.top() << endl;}
cout << "\n" << endl;
return 0;}
第二段代码使用迭代器
#include<string>
#include<iostream>
#include<stack>
using namespace std;
int main(){
string str ;
stack<char> s;
cin >> str ;
for(string::iterator itr = str.begin();itr!=str.end();itr++){
cout << *itr << "\n";
s.push(*itr);
cout << "Top of the stack " << s.top() << endl;}
cout << "\n" << endl;
return 0;}
它们只是两个简单的代码我只想知道哪种更有效?
答案 0 :(得分:5)
如果我们根据基本操作方法的数量来定义效率,我相信这两种方法之间没有区别。您可能知道std::string
的实现基于简单的字符数组(就像std::vector
),这意味着字符存储为内存的连续块。这允许在恒定数量的操作(O(1))中访问有效范围内的任何元素。因此,检索第i个字符str[i]
需要O(1)操作,就像访问数组的条目一样。类似地,在第二种方法中,您使用迭代器,粗略地说,这是指向此上下文中数组中位置的指针。因此,访问其内容*itr
并将其进一步移动一个位置itr++
与将指针移动到数组并检索其内容的效率相同。
同样,关键的想法是std::string
中的字符存储在连续数组中,这为它提供了这样的功能。您可能希望将其实现与std::map
进行比较,其中底层实现是红黑树,当然,它不是数组。因此[]
运算符以对数时间工作(与std::string
中的常量相反)。
编辑:
正如评论中所提到的,cout
输出相对昂贵(但仍然是O(1))。所以如果你想检查一下真实的&#39;效率,您必须删除输出或在程序启动时调用std::ios_base::sync_with_stdio(false);
以提高cout
的速度。