2

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

3 回答 3

12

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

用这个:

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

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

另请注意,上面的初始化中没有'='中间'v''{'。这种初始化称为C++11 引入的统一初始化。更多示例在这里

于 2012-05-27T08:09:47.257 回答
3

但我发现自己想知道:是否有其他方法可以初始化向量而无需提前创建字符串或不必使用删除?

不,要存储指向某物的指针,您必须将该某物存储在其他地方。否则将没有指针指向的地方。

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

于 2012-05-27T08:32:35.260 回答
0

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

于 2012-05-27T08:34:39.573 回答