【问题标题】:Can a vector<string *> be initialized directly without new?可以不用new直接初始化vector<string *>吗?
【发布时间】:2012-05-27 08:06:40
【问题描述】:

我正在学习 C++/通用编程,有时会在为旧标准编写的练习时尝试 C++11 功能。

这个练习涉及一个指向字符串的指针向量。

#include <vector>
#include <string>
#include <iostream>
int main()
{
    using std::string ;
    using std::vector ;
    using std::cout ;
    using std::endl ;

    vector<string *> v = {new string("Hello") , new string("World")} ;
    for (string * x : v) {
        cout << *x << " " ;
        delete x ;
    }
    cout << endl ;
}

我在弄清楚如何将初始化列表与这个向量一起使用时有点困难,但这似乎可行。

这个版本也可以:

    //...
    string s1 = "Hello" ;
    string s2 = "World" ;
    vector<string *> v = {&s1 , &s2} ;
    for (string * x : v)
        cout << *x << " " ;
    //...

它看起来更干净,而且从我目前学到的知识来看,它似乎是更好的解决方案。

但我发现自己想知道:是否有其他方法可以在不提前创建字符串或不必使用删除的情况下初始化向量?我读到的内容表明 {} 列表应该是通用的。

对于它的价值,这会产生一个相当灾难性的错误:

vector<string *> v = {"Hello" , "World"} ;

【问题讨论】:

    标签: c++ pointers vector


    【解决方案1】:

    你为什么首先使用std::string*?你有什么理由吗?我不这么认为。

    使用这个:

    std::vector<std::string> v{"Hello" , "World"};
    

    现在,您不需要使用new。这些类的设计正是因为您可以避免自己使用new

    还要注意上面初始化中'v''{'之间没有'='。这种初始化称为 C++11 引入的统一初始化More examples here.

    【讨论】:

    • 这似乎是任意的,但练习继续使用箭头运算符,所以它可能只是为了这个而使用指针。然后,一旦我尝试使用初始化列表而不是 push_back(),我遇到了这个问题,现在我很好奇是否还有其他方法,与原始问题无关。
    • @Enra:你用一个不好的例子来学习箭头运算符。您为什么不自己实现一些类,并探索如何使用-&gt; 以及许多其他东西,您将在此过程中学习。
    • 甚至不能在苹果 clang 4.2 上运行,我有点失望。
    【解决方案2】:

    但我发现自己想知道:是否有其他方法可以在不提前创建字符串或不必使用 delete 的情况下初始化向量?

    不,要存储指向 something 的指针,您必须将这个东西存储在其他地方。否则指针将无处可指。

    感觉很奇怪可能是因为这一种不寻常的存储字符串的方式。如果这不是(人工)练习,您可以使用std::vector&lt;std::string&gt;&gt; 并摆脱您的问题。

    【讨论】:

      【解决方案3】:

      就像 Nawaz 所说,为什么还要使用指向字符串的指针呢?只是为了使用 -> 运算符?创建一个包含一些私有变量的类并使用引用返回它们。这是何时使用箭头运算符的更好示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-14
        • 2010-11-06
        • 2011-02-15
        • 1970-01-01
        • 2023-01-29
        相关资源
        最近更新 更多