繁体   English   中英

C ++向量和指标

[英]c++ vectors and pointers

据我了解,如果我不存储指针,c ++中的所有内容都会被复制,这可能导致性能下降(忽略示例的简单性)。 所以我以为我将对象存储为指针而不是向量中的字符串对象,这对性能更好吗? (令人震惊的是我的弦很长,而且很多)。

当我尝试遍历字符串指针的向量时的问题是我无法从它们中提取实际值

string test = "my-name";
vector<string*> names(20);
names.push_back(&test);

vector<string*>::iterator iterator = names.begin();
while (iterator != names.end())
{
    std::cout << (*iterator) << ":" << std::endl;
    // std::cout << *(*iterator); // fails

    iterator++;
}

看到注释行,我在接收字符串指针时没有问题。 但是,当我尝试获取字符串指针值时,我得到了一个错误(我找不到错误完全是什么,但程序只是失败了)。

我也尝试将( 迭代器)存储在新的字符串变量中,但这没有帮助吗?

您已经创建了向量并将其初始化为包含20个项目。 这些项正在默认初始化,在指针的情况下为空指针。 该程序在解引用那些空指针时遇到麻烦。

一条建议是在您遇到问题之前,不要担心最有效的方法。 此代码肯定会工作有更好的vector<string>与一个vector<string*>

不,不,不超过一千次

不要过早优化。 如果程序运行很快,则无需担心性能。 在这种情况下,由于每个对象仅是单个指针的目标,因此指针显然会通过消耗内存和时间来降低性能!

更不用说手动指针编程容易引入错误,特别是对于新手。 牺牲性能的正确性和稳定性是一个巨大的倒退。

C ++的优点是通过提供封装的数据结构和算法简化了优化过程。 因此,当您决定进行优化时,通常可以通过交换标准零件来实现。

如果您想了解有关优化数据结构的信息,请阅读智能指针

这可能是您想要的程序:

vector<string> names(20, "my-name");

for ( vector<string>::iterator iterator = names.begin();
      iterator != names.end();
      ++ iterator )
{
    std::cout << *iterator << '\n';
}

您的代码看起来像是将指向基于堆栈的变量的指针存储到向量中。 一旦声明了字符串的函数返回,该字符串就会变成垃圾并且指针无效。 如果要将指针存储到向量中,则可能需要动态分配字符串(使用new)。

看一下您的初始化:

string test = "my-name";
vector<string*> names(20);
names.push_back(&test);

首先创建一个包含20个元素的std::vector

然后,使用push_back附加第21个元素,该元素指向有效的string 很好,但是该元素永远不会在循环中到达:第一次迭代已经崩溃,因为向量中存储的前20个指针未指向有效的string s。

取消引用无效的指针会导致崩溃。 如果确保向量中具有有效的指针,则**iterator可以很好地访问元素。

尝试

if (*iterator)
{
  std::cout << *(*iterator) << ":" << std::endl;
}

马克·兰瑟姆(Mark Ransom)解释了为什么现在有些指针

string test = "my-name";
vector<string*> names(20);

向量的size为20,这意味着它可以容纳20个字符串指针。

names.push_back(&test);

通过push_back操作,您将省略前20个元素,并向保存test的地址的向量添加一个新元素。 vector的前20个元素未初始化,可能指向垃圾。 while循环一直运行到大小为21的向量的末尾,并且取消引用未初始化的指针是导致问题的原因。 由于vector的大小可以通过push_back操作动态增加,因此无需明确提及大小。

vector<string*> names; // Not explicitly mentioning the size and the rest of
                       // the program should work as expected.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM