C++ C++;-指向函数中局部变量的指针

C++ C++;-指向函数中局部变量的指针,c++,pointers,memory,C++,Pointers,Memory,我知道这看起来像是一个已经问了一千次的新手问题。但我一直在寻找确切的答案,却没有找到答案 总之,我正在编写一个代码,用不同的数据填充XML 我正在尝试优化其中的一部分。“天真”准则如下: xml << "<Node>"; for(auto& input : object.m_vec) { if(input == "Something") { xml << input; } } xml << "<

我知道这看起来像是一个已经问了一千次的新手问题。但我一直在寻找确切的答案,却没有找到答案

总之,我正在编写一个代码,用不同的数据填充XML

我正在尝试优化其中的一部分。“天真”准则如下:

xml << "<Node>";
for(auto& input : object.m_vec)
{
    if(input == "Something")
    {
        xml << input;
    }
}
xml << "</Node>";
for(auto& input : object.m_vec)
{
    if(input == "SomethingElse")
    {
        xml << "<OtherNode>";
        xml << input;
        xml << "</OtherNode>";
        break;
    }
}
对我来说,这里的要点是不需要额外的内存,也不需要额外的循环。但是指向局部变量的指针让我很烦恼。以我初学者的眼光来看,我看不出它会导致什么错误


这样行吗?为什么?您看到更好的方法了吗?

您需要确保您的compairson也在
向量指针中查找现有值,因为您最初的第二个循环只关心它遇到的第一个值

else if(VecPointer && input == "SomethingElse")
不要查找
->empty()
,因为这是在访问指针并询问指向的向量是否为空。如果一开始没有什么需要指出的,那么在语句的
->
阶段,您将度过一段不愉快的时光。相反,如果反对它,因为它是指针

if(VecPointer)
最后,您使用一个向量来保存来自m_vec的一个值,我假设来自其他代码的m_vec不是
向量
,而是
向量
——在后一种情况下,您的
向量指针
应该是
std::string*

std::string* VecPointer = nullptr;
我正在尝试优化其中的一部分。

这样行吗

也许不是!这可能已经是对你时间的拙劣利用。你确定这会影响你的表现吗?或者根本就存在性能问题

还记得唐·克努斯(Don Knuth)的古老格言吗:

你认为有更好的方法吗

考虑一下哪些部分实际占用的时间最多


另一方面,您可以使用标准库算法来简化(未优化的)代码。例如:

if (std::ranges::find(std::begin(object.m_vec) std::end(object.m_vec), "SomethingElse"s ) 
    != std::end(object.m_vec)) 
{
    xml << "<OtherNode>" << whatever << "</OtherNode>";
}
if(std::ranges::find(std::begin(object.m_vec)std::end(object.m_vec),“SomethingElse”s)
!=std::end(object.m_vec))
{

xml您会返回指向函数外部的指针吗?目前的情况是,如果没有命中,您可能会使用未初始化的
VecPointer
。这将使程序崩溃。您可能会将其包装在某种智能指针中。此外,除非您非常小心,它所指向的内容存在于使用结果的同一范围内,否则y你可能会导致其他崩溃。几乎总是,指向向量的指针是一种代码味道。这不一定是错误的,但它很少使用或需要,通常应该避免。这是因为
向量本身占用的空间很小,通常是3个指针,因为它在堆上创建了它的对象,并且只指向它们。所以点指向堆(对象所在的位置)的指针的指针无效。也更难读取。
if (std::ranges::find(std::begin(object.m_vec) std::end(object.m_vec), "SomethingElse"s ) 
    != std::end(object.m_vec)) 
{
    xml << "<OtherNode>" << whatever << "</OtherNode>";
}