c ++字符串向量 - 指针问题

时间:2010-09-13 14:55:19

标签: c++ vector

我正在尝试编写一个获取字符串向量并返回指向随机元素的指针的方法。您能告诉我以下代码有什么问题吗?

string* getRandomOption(vector<string> currOptions){
    vector<string>::iterator it;
    it=currOptions.begin(); 
    string* res;

    int nOptions = currOptions.size();

    if(nOptions != 1){
        int idx = rand() % (nOptions-1);

        while (idx!=0){
            it++;
            idx--;
        };

    };


    res = &(*it);
};

谢谢, 李

6 个答案:

答案 0 :(得分:10)

为什么要返回指针?保持简单!

std::string random_option(const std::vector<std::string>& options)
{
    return options[rand() % options.size()];
}

由于这适用于任何类型,不仅仅是字符串,我更喜欢通用解决方案:

template <typename T>
T random_element(const std::vector<T>& options)
{
    return options[rand() % options.size()];
}

答案 1 :(得分:5)

如果要“返回指向随机元素的指针”,则需要将引用传递给向量。目前,已复制

你应该这样做:

string* getRandomOption(vector<string> & currOptions)

顺便说一下,你的函数暂时没有return,你需要添加一个return语句来发送你的指针。

答案 2 :(得分:4)

Better version of the same,因为它适用于任何容器,而不仅仅是矢量。这是C ++ 03版本:

template <typename ForwardIterator>
ForwardIterator random_element(ForwardIterator begin, ForwardIterator end)
{
    typename std::iterator_traits<ForwardIterator>::difference_type
        size = std::distance(begin, end);
    if (size) //divide by zero errors are bad
        std::advance(begin, std::rand() % size);
    return begin;
}

如果您使用的是C ++ 11,则可以将以上内容替换为:

template <typename ForwardIterator>
ForwardIterator random_element(ForwardIterator begin, ForwardIterator end)
{
    auto size = std::distance(begin, end);
    if (size) //divide by zero errors are bad
        std::advance(begin, std::rand() % size);
    return begin;
}

绕过std::iterator_traits<t>::difference_type胶水。

答案 3 :(得分:3)

您正在按值传递矢量,即该函数具有原始矢量的本地副本。 然后你[打算]返回一个指向这个向量中元素的指针。但是当你从函数返回时,这个本地副本会被破坏,你的指针会悬空。

答案 4 :(得分:1)

也许您想将您的函数原型更改为:

const string* getRandomOption(const vector<string>& currOptions)

string* getRandomOption(vector<string>& currOptions)

或者你只是从临时副本中获取一个元素。

答案 5 :(得分:1)

除了其他答案中提到的其他问题之外,当向量调整大小时,任何指针或迭代器(或任何性质的引用)都将变为无效。不要返回指针。