可以直接初始化vector <string * =“”>而不使用new?</string>

时间:2012-05-27 08:06:40

标签: c++ pointers vector

我正在学习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"} ;

3 个答案:

答案 0 :(得分:12)

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

使用此:

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

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

另请注意,上述初始化中'=''v'之间没有'{'。这种初始化称为C ++ 11引入的统一初始化More examples here

答案 1 :(得分:3)

  

但我发现自己在想:是否有其他方法来初始化向量而不提前创建字符串或不得不使用删除?

不,要存储指向某事的指针,你必须将这些东西存储在其他地方。否则指针将没有指向的位置。

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

答案 2 :(得分:0)

像Nawaz说的那样,为什么要使用指向字符串的指针呢?只是为了使用 - &gt;运营商?创建一个具有一些私有变量的类,并使用引用返回它们。这是何时使用箭头操作符的更好示例。