用std :: vector编写可重复使用的向量时遇到麻烦

时间:2015-03-04 15:22:18

标签: c++

我是c ++编码的巴西初学者(道歉我对这两方面的知识不足)。我试图写一个.txt输出文件,其中包含我用鼠标点击的像素位置。我正在使用opencv库,因此这是代码的一个功能部分:

#include "opencv2/highgui/highgui.hpp"
#include <iostream>    
#include <vector> 
#include <fstream>    
using namespace std;
using namespace cv;

//declaration of vector and counter
int i = 1;
std::vector<int>vet_x(i);
std::vector<int>vet_y(i);


//the callback function
void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
    if (event == EVENT_LBUTTONDOWN)
    {

        vet_x.resize(i);
        vet_y.resize(i);

        vet_x[i] = x;
        vet_y[i] = y;
        i++;

        cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
    }
}

int main(int argc, char** argv)
{

    Mat img = imread("lena.jpg");
    //Create a window
    namedWindow("Mouse Track Test", 1);
    //set the callback function for mouse event
    setMouseCallback("Mouse Track Test", CallBackFunc, NULL);
    //show the image
    imshow("Mouse Track Test", img);
    // Wait until user press some key
    waitKey(0);

    //the writing begins after the press of the key
    ofstream myfile;
    myfile.open("points.txt");

    for (int j = 1; j <= vet_x.size(); j++)
    {
        cout << vet_x[j] << "," << vet_y[j] << endl;
        myfile << vet_x[j] << "," << vet_y[j] << endl;
    }
    myfile.close();

    return 0;
}

问题是:文件只写最后点击的位置! 但是,如果我转动&#34; vet_x.reserve(1024);&#34;线,它运作良好,但仅适用于y坐标......

那么,我的错误是什么?

3 个答案:

答案 0 :(得分:2)

C ++数组索引是基于0的。因此,当您将向量v的大小调整为1并指定给v[1]时,您将分配给不存在的项目。这是未定义的行为。

要捕获这种越界索引,您可以使用at方法,这可以保证异常。即,写v.at(i)而不是v[i]

但是,您应该只使用push_back成员函数向向量添加项目。即,v.push_back( x ),其中x是您要添加的值。使用2D点的单个矢量,而不是x的一个矢量和y的一个矢量也是一个好主意。

答案 1 :(得分:1)

vet_x.resize(i);
vet_y.resize(i);

vet_x[i]=x;
vet_y[i]=y;

指定元素超出范围,这是一种未定义的行为。 resize(i)后最后一个有效索引为i-1std::vector operator [] never insert elements in the container.

而只是做

vet_x.push_back(x);
vet_y.push_back(y);

答案 2 :(得分:0)

将变量添加到向量中的方法是错误的。我建议这个:

struct Point
{
    int x, y;
    Point(int sx, int sy)
        :x(sx),y(sy)
    {        
    }
};

std::vector<Point> clickedPositions;

//the callback function
void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
    if  ( event == EVENT_LBUTTONDOWN )
    {
        clickedPositions.push_back(Point(x,y));
    }
}

并将其写入文件:

for(int j=0; j<clickedPositions.size(); j++)
  {   
   myfile << clickedPositions[j].x < <","<< clickedPositions[j].y <<endl;
  }