【问题标题】:c++: how to determine if a variable is a vector elementc ++:如何确定变量是否为向量元素
【发布时间】:2017-04-28 14:03:04
【问题描述】:

我有一个方法,我想根据传递的变量是否是向量的元素来执行不同的方法,例如:

void method(int a){
if (/*a is an element of a vector*/) //do one thing
else //do another thing
}

然后在 main:

vector<int> a;
a.pushback(1);
int b = 1;
method(a[0]); // does one thing
method(b); // does the other thing

最简单的方法是什么?

【问题讨论】:

  • 为什么你想这样做?这听起来像一个非常个坏主意。
  • 向量保存值。无论您传入a[0] 还是1,向量中都有一个1。您真正想要解决的高层次问题是什么?
  • 这听起来像xy problem。向量元素与独立变量的操作有什么区别?您可以声明第二个函数来获取向量和索引void method(vector&amp; a, size_t index){
  • @HermannDöppes 呃,对不起。现在我不知道我在问自己什么。我的大脑短路了
  • @Yokubasu 它发生了。快点好起来。 (=

标签: c++ vector methods


【解决方案1】:

好吧,这在所有情况下都是不可能的,因为它实际上需要你的函数查看它是如何执行的,而 C++ 中没有这样的东西。讨厌的 eval() 浮现在脑海中。

但在某些情况下,当您的向量是全局实体时,您可以通过链接而不是值来传递变量。然后,您可以检查它是否适合所需向量的开始和结束之间的空间。这就是它的完成方式(虽然没有测试,但应该可以)

vector<int> v;
//fill it somewhere somehow


void method(int& a)
{
    int* beg = v.data();
    int* end = beg + v.size();
    int* val = &a;
    if ((val >= beg) && (val < end))
    {
        //it is a part of vector
    }
    else
    {
        //it is not a part of vector
    {
}

问题是你真的不应该这样做......正如 cmets 中的人所说,它看起来确实像一个 XY 问题。

【讨论】:

    【解决方案2】:

    intintint 脖子上没有标签,告诉所有人它来自哪里。当 int 被传递给函数时,没有任何东西可以指定 int 的来源。

    您应该以此为契机了解迭代器,并实现一个重载方法,该方法需要一个

    void method(int);
    

    对于一个参数,或者一个

    void method(std::vector<int>::iterator iter);
    

    对于一个参数(或者,可能是一个const_iterator),并通过将一个迭代器传递给向量中的int 来调用替代method()

    【讨论】:

    • 据我们所知,这种方法可能会解决他们的问题,或者可能会导致他们陷入某种厄运。我认为我们应该等待 OP 澄清,然后再发布对答案的猜测。
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2016-05-17
    • 2010-11-13
    相关资源
    最近更新 更多