2013-04-09 64 views
1

这将打印的地址我的字符串,而不是它的内容,ostream的,复印功能打印字符串的地址,而不是字符串内容

#include <memory> 
#include <string> 
#include <list> 
#include <iostream> 
#include <iterator> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    unique_ptr<list<shared_ptr<string>>> upList (new list<shared_ptr<string>>); 
    shared_ptr<string> spNation (new string ("India")); 
    upList->push_back (spNation); 
    copy (upList->begin(), upList->end(), ostream_iterator<shared_ptr<string>> (cout, "\n ")); 
    return 0; 
} 

我的问题是:

  1. 正在采取什么ostream_iterator<shared_ptr<string>> shared_ptr或字符串作为其主要对象。
  2. 如何使用此方法打印实际字符串内容(即印度)。
  3. 这种方法比传统的for循环更适合打印所有节点内容。
+0

你不需要shared_ptr ,字符串就足够好了 – piokuc 2013-04-09 08:46:20

回答

1

首先:为什么你在这里用shared_ptr<string>而不是string?你不这样做。

1)

shared_ptr<string> 

2)使用std::for_each与拉姆达(或range-based for loop

for_each(upList->begin(), upList->end(), [](const shared_ptr<string>& p) 
{ 
    cout << *p << endl; 
}); 

for (const auto& p : upList) 
{ 
    std::cout << *p << std::endl; 
} 
3

什么ostream_iterator<shared_ptr<string>>正在采取的shared_ptr或字符串作为其主要对象。

您已经为shared_ptr<string>实例化了ostream_iterator,所以这就是它将尝试输出的内容。

如何使用此方法打印实际字符串内容(即印度)。

如果你真的想使用共享指针出于某种原因,那么你就不能使用,因为这copy不会撤销间接的额外水平。无论是使用普通的循环,或摆脱不必要的间接性:

list<string> list; 
list.push_back("India"); 
copy(list.begin(), list.end(), ostream_iterator<string>(cout, "\n ")); 

当然,它看起来并不令人兴奋没有所有的箭头,模板,新的表达式和pseudohungarian疣,但任何人都试图保持代码不会感谢你添加这样的装饰。

是这种方法比传统的最好的for循环打印所有节点内容

这是最好的时候它使代码更简单。当它不,它不是。