ostream,复制函数打印字符串地址,而不是字符串内容

时间:2013-04-09 08:44:18

标签: c++ list iostream

这将打印我的字符串的地址,但不打印其内容

#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循环更适合打印所有节点内容。

2 个答案:

答案 0 :(得分:3)

  

ostream_iterator<shared_ptr<string>>将shared_ptr或字符串作为其主要对象。

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

  

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

如果您确实想要出于某种原因使用共享指针,则不能使用copy,因为这不会撤消额外的间接级别。要么使用普通循环,要么摆脱不必要的间接:

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

当然,如果没有所有的箭头,模板,新表达式和伪肛门疣,它看起来并不令人兴奋,但任何试图维护代码的人都不会感谢你添加这些装饰。

  

这种方法比传统的for循环更适合打印所有节点内容

最好使代码更简单。如果没有,则不是。

答案 1 :(得分:1)

首先:为什么在这里使用shared_ptr<string>代替string?你不应该这样做。

1)

shared_ptr<string>

2)将std::for_each与lambda(或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;
}